PATH:
usr
/
share
/
doc
/
perl-Parse-RecDescent-1.967009
/
demo
use v5.10; use warnings; # WHO IS NEXT TO WHOM? use Parse::RecDescent; $grammar = q{ <nocheck> inputs : input(s) input : who_question "\n" {1} | is_question "\n" {1} | statement "\n" {1} | /bye|quit|exit/ { exit } | <reject:!$text> <error> # ERROR IF NOT END OF TEXT | { print STDERR "resyncing\n" } { _error(@$_) foreach @{$thisparser->{errors}}; } <resync> statement: namelist are <commit> 'next' 'to' namelist { ::nextto $item[1], $item[6], $thisline; 1 } | <error?> <reject> who_question: 'who' <commit> are 'next' 'to' name '?' { ::whonextto $item[6] ; 1 } | <error?> <reject> is_question: 'is' <commit> name 'next' 'to' name '?' { ::isnextto($item[3], $item[6]); 1 } | <error?> <reject> namelist : name(s) 'and' <commit> namelist { [ @{$item[1]}, @{$item[3]} ] } | name(s) name : ...!'who' ...!'and' ...!are /[A-Za-z]+/ are : 'is' | 'are' }; $parse = new Parse::RecDescent ($grammar); $parse->{tokensep} = '[ \t]*'; $input = ''; print "> "; while (<>) { if (/^\.$/) { $parse->inputs($input) || print "huh?\n"; $input = '' } else { $input .= $_ } print "> "; } sub nextto($$$) { foreach $A ( @{$_[0]} ) { foreach $B ( @{$_[1]} ) { nexttoAB($A,$B,$_[2]); } } print "okay\n"; } sub nexttoAB($$$) { $nextto{$_[0]} or $nextto{$_[0]} = []; $nextto{$_[1]} or $nextto{$_[1]} = []; push @{$nextto{$_[0]}}, $_[1]; push @{$nextto{$_[1]}}, $_[0]; print "Learnt something from line $_[2]\n"; } sub whonextto($) { if (defined $nextto{$_[0]}) { print join(" and ", @{$nextto{$_[0]}}) . ".\n"; } else { print "sorry, I've never heard of $_[0].\n"; } } sub isnextto($$) { if (!$nextto{$_[0]}) { print "sorry, I've never heard of $_[0].\n"; } elsif (!$nextto{$_[1]}) { print "sorry, I've never heard of $_[1].\n"; } else { foreach $name (@{$nextto{$_[0]}}) { if ($name eq $_[1]) { print "yes\n"; return } } print "no\n"; } }
[-] demo_cpp.pl
[edit]
[-] demo_autorule.pl
[edit]
[-] demo_errors.pl
[edit]
[-] demo_piecewise.pl
[edit]
[-] demo_logic.pl
[edit]
[-] demo_skipcomment.pl
[edit]
[-] demo_implicit.pl
[edit]
[-] demo_separators.pl
[edit]
[-] demo_perlparsing.pl
[edit]
[-] demo_street.pl
[edit]
[-] demo_scoredsep.pl
[edit]
[-] demo.c
[edit]
[-] demo_textgen.pl
[edit]
[-] demo.pl
[edit]
[-] demo_calc.pl
[edit]
[+]
..
[-] demo_another_Cgrammar.pl
[edit]
[-] demo_matchrule2.pl
[edit]
[-] demo_mccoy.pl
[edit]
[-] demo_restructure_painful.pl
[edit]
[-] demo_methods.pl
[edit]
[-] demo_language.pl
[edit]
[-] demo_selfmod.pl
[edit]
[-] demo_OOautoparsetree.pl
[edit]
[-] demo_codeblock.pl
[edit]
[-] demo_simplequery.pl
[edit]
[-] demo_restructure_easy.pl
[edit]
[-] demo_tokens.pl
[edit]
[-] demo_decomment.pl
[edit]
[-] demo_recipe.pl
[edit]
[-] demo_delete.pl
[edit]
[-] demo_lisplike.pl
[edit]
[-] demo_bad.pl
[edit]
[-] demo_arithmetic.pl
[edit]
[-] demo_leftassoc.pl
[edit]
[-] demo_PerlCSV.pl
[edit]
[-] demo_metaRD.pm
[edit]
[-] demo_derived.pl
[edit]
[-] demo_opreps.pl
[edit]
[-] demo_matchrule.pl
[edit]
[-] demo_LaTeXish_autoact.pl
[edit]
[-] demo_operator.pl
[edit]
[-] demo_autoscoresep.pl
[edit]
[-] demo_Cgrammar_v2.pl
[edit]
[-] demo_NL2SQL.pl
[edit]
[-] demo_Cgrammar.pl
[edit]
[-] demo_randomsentence.pl
[edit]
[-] demo_template.pl
[edit]
[-] demo_quicklist.pl
[edit]
[-] demo_itemhash.pl
[edit]
[-] demo_buildcalc.pl
[edit]
[-] demo_leftop.pl
[edit]
[-] demo_decomment_nonlocal.pl
[edit]
[-] demo_dot.pl
[edit]
[-] demo_LaTeXish.pl
[edit]
[-] demo_precalc.pl
[edit]
[-] demo_eval.pl
[edit]
[-] demo_autostub.pl
[edit]
[-] demo_whoson.pl
[edit]
[-] demo_lexer.pl
[edit]
[-] demo_OOparsetree.pl
[edit]
[-] demo_parsetree.pl
[edit]
[-] demo_simple.pl
[edit]
[-] demo_embedding.pl
[edit]
[-] demo_simpleXML.pl
[edit]
[-] demo_undumper.pl
[edit]