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"; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
demo.c | File | 126 B | 0644 |
|
demo.pl | File | 371 B | 0644 |
|
demo_Cgrammar.pl | File | 10.08 KB | 0644 |
|
demo_Cgrammar_v2.pl | File | 7.08 KB | 0644 |
|
demo_LaTeXish.pl | File | 1.63 KB | 0644 |
|
demo_LaTeXish_autoact.pl | File | 1.72 KB | 0644 |
|
demo_NL2SQL.pl | File | 2.27 KB | 0644 |
|
demo_OOautoparsetree.pl | File | 1.98 KB | 0644 |
|
demo_OOparsetree.pl | File | 1.21 KB | 0644 |
|
demo_PerlCSV.pl | File | 413 B | 0644 |
|
demo_another_Cgrammar.pl | File | 21.08 KB | 0644 |
|
demo_arithmetic.pl | File | 758 B | 0644 |
|
demo_autorule.pl | File | 309 B | 0644 |
|
demo_autoscoresep.pl | File | 587 B | 0644 |
|
demo_autostub.pl | File | 271 B | 0644 |
|
demo_bad.pl | File | 816 B | 0644 |
|
demo_buildcalc.pl | File | 1.3 KB | 0644 |
|
demo_calc.pl | File | 1.82 KB | 0644 |
|
demo_codeblock.pl | File | 287 B | 0644 |
|
demo_cpp.pl | File | 1.23 KB | 0644 |
|
demo_decomment.pl | File | 2.55 KB | 0644 |
|
demo_decomment_nonlocal.pl | File | 2.44 KB | 0644 |
|
demo_delete.pl | File | 901 B | 0644 |
|
demo_derived.pl | File | 891 B | 0644 |
|
demo_dot.pl | File | 4.79 KB | 0644 |
|
demo_embedding.pl | File | 977 B | 0644 |
|
demo_errors.pl | File | 965 B | 0644 |
|
demo_eval.pl | File | 1.15 KB | 0644 |
|
demo_implicit.pl | File | 568 B | 0644 |
|
demo_itemhash.pl | File | 1.64 KB | 0644 |
|
demo_language.pl | File | 2.57 KB | 0644 |
|
demo_leftassoc.pl | File | 1.06 KB | 0644 |
|
demo_leftop.pl | File | 957 B | 0644 |
|
demo_lexer.pl | File | 577 B | 0644 |
|
demo_lisplike.pl | File | 1.49 KB | 0644 |
|
demo_logic.pl | File | 542 B | 0644 |
|
demo_matchrule.pl | File | 772 B | 0644 |
|
demo_matchrule2.pl | File | 540 B | 0644 |
|
demo_mccoy.pl | File | 516 B | 0644 |
|
demo_metaRD.pm | File | 3.02 KB | 0644 |
|
demo_methods.pl | File | 785 B | 0644 |
|
demo_operator.pl | File | 835 B | 0644 |
|
demo_opreps.pl | File | 1.01 KB | 0644 |
|
demo_parsetree.pl | File | 661 B | 0644 |
|
demo_perlparsing.pl | File | 956 B | 0644 |
|
demo_piecewise.pl | File | 3.03 KB | 0644 |
|
demo_precalc.pl | File | 743 B | 0644 |
|
demo_quicklist.pl | File | 1.5 KB | 0644 |
|
demo_randomsentence.pl | File | 2.89 KB | 0644 |
|
demo_recipe.pl | File | 2.09 KB | 0644 |
|
demo_restructure_easy.pl | File | 1.21 KB | 0644 |
|
demo_restructure_painful.pl | File | 1.97 KB | 0644 |
|
demo_scoredsep.pl | File | 606 B | 0644 |
|
demo_selfmod.pl | File | 953 B | 0644 |
|
demo_separators.pl | File | 779 B | 0644 |
|
demo_simple.pl | File | 1.94 KB | 0644 |
|
demo_simpleXML.pl | File | 1.87 KB | 0644 |
|
demo_simplequery.pl | File | 831 B | 0644 |
|
demo_skipcomment.pl | File | 609 B | 0644 |
|
demo_street.pl | File | 502 B | 0644 |
|
demo_template.pl | File | 688 B | 0644 |
|
demo_textgen.pl | File | 5 KB | 0644 |
|
demo_tokens.pl | File | 552 B | 0644 |
|
demo_undumper.pl | File | 23.17 KB | 0644 |
|
demo_whoson.pl | File | 2.61 KB | 0644 |
|