diff options
| author | Adam Russell <ac.russell@live.com> | 2024-03-10 19:29:29 -0400 |
|---|---|---|
| committer | Adam Russell <ac.russell@live.com> | 2024-03-10 19:29:29 -0400 |
| commit | 0e01eaf0f3199e33e8a947991b96290321b42d67 (patch) | |
| tree | 791a927bf21896e40497eddbf81307d2de43777d /challenge-259 | |
| parent | 4ede4148a206665a6cd242aa6c1fd2f4d4b5f2e2 (diff) | |
| download | perlweeklychallenge-club-0e01eaf0f3199e33e8a947991b96290321b42d67.tar.gz perlweeklychallenge-club-0e01eaf0f3199e33e8a947991b96290321b42d67.tar.bz2 perlweeklychallenge-club-0e01eaf0f3199e33e8a947991b96290321b42d67.zip | |
added yapp grammar file
Diffstat (limited to 'challenge-259')
| -rw-r--r-- | challenge-259/adam-russell/perl/Ch2.pm | 52 | ||||
| -rw-r--r-- | challenge-259/adam-russell/perl/ch-2.yp | 68 |
2 files changed, 94 insertions, 26 deletions
diff --git a/challenge-259/adam-russell/perl/Ch2.pm b/challenge-259/adam-russell/perl/Ch2.pm index 6974b97a14..9bcf3c54d6 100644 --- a/challenge-259/adam-russell/perl/Ch2.pm +++ b/challenge-259/adam-russell/perl/Ch2.pm @@ -42,77 +42,77 @@ sub new { }, {#State 2 ACTIONS => { - 'WORD' => 5 + 'WORD' => 4 }, GOTOS => { - 'id' => 4 + 'id' => 5 } }, {#State 3 DEFAULT => 0 }, {#State 4 + DEFAULT => -2 + }, + {#State 5 ACTIONS => { - 'WORD' => 7 + 'WORD' => 6 }, GOTOS => { - 'field' => 6, - 'fields' => 8 + 'field' => 8, + 'fields' => 7 } }, - {#State 5 - DEFAULT => -2 - }, {#State 6 - DEFAULT => -8 - }, - {#State 7 ACTIONS => { "=" => 9 } }, - {#State 8 + {#State 7 ACTIONS => { - 'WORD' => 7, - 'END' => 11 + 'END' => 10, + 'WORD' => 6 }, GOTOS => { - 'field' => 10 + 'field' => 11 } }, + {#State 8 + DEFAULT => -8 + }, {#State 9 ACTIONS => { - 'QUOTE' => 13, - 'NUMBER' => 12 + 'NUMBER' => 12, + 'QUOTE' => 13 } }, {#State 10 - DEFAULT => -9 + DEFAULT => -1 }, {#State 11 - DEFAULT => -1 + DEFAULT => -9 }, {#State 12 DEFAULT => -6 }, {#State 13 ACTIONS => { - 'WORD' => 15 + 'WORD' => 14 }, GOTOS => { - 'words' => 14 + 'words' => 15 } }, {#State 14 + DEFAULT => -3 + }, + {#State 15 ACTIONS => { + 'ESCAPED_QUOTE' => 17, 'WORD' => 16, - 'QUOTE' => 18, - 'ESCAPED_QUOTE' => 17 + 'QUOTE' => 18 } }, - {#State 15 - DEFAULT => -3 - }, {#State 16 DEFAULT => -4 }, diff --git a/challenge-259/adam-russell/perl/ch-2.yp b/challenge-259/adam-russell/perl/ch-2.yp new file mode 100644 index 0000000000..a63147bd66 --- /dev/null +++ b/challenge-259/adam-russell/perl/ch-2.yp @@ -0,0 +1,68 @@ +%token NUMBER +%token START +%token END +%token WORD +%token QUOTE +%token ESCAPED_QUOTE +%{ + my %record = (fields => {}); +%} +%% + +file: START id fields END {$record{name} = $_[2]; \%record;} +; + +id: WORD +; + +words: WORD + | words WORD + | words ESCAPED_QUOTE WORD ESCAPED_QUOTE +; + +field: WORD '=' NUMBER {$record{fields}->{$_[1]} = $_[3]} + | WORD '=' QUOTE words QUOTE {$record{fields}->{$_[1]} = $_[4]} +; + +fields: field + | fields field +; + +%% + +sub lexer{ + my($parser) = @_; + $parser->YYData->{INPUT} or return('', undef); + $parser->YYData->{INPUT} =~ s/^[ \t]//g; + ## + # send tokens to parser + ## + for($parser->YYData->{INPUT}){ + s/^([0-9]+)// and return ("NUMBER", $1); + s/^({%)// and return ("START", $1); + s/^(%})// and return ("END", $1); + s/^(\w+)// and return ("WORD", $1); + s/^(=)// and return ("=", $1); + s/^(")// and return ("QUOTE", $1); + s/^(\\")// and return ("ESCAPED_QUOTE", $1); + s/^(\\\\)// and return ("WORD", $1); + } +} + +sub error{ + exists $_[0]->YYData->{ERRMSG} + and do{ + print $_[0]->YYData->{ERRMSG}; + return; + }; + print "syntax error\n"; +} + +sub parse{ + my($self, $input) = @_; + $input =~ tr/\t/ /s; + $input =~ tr/ //s; + $self->YYData->{INPUT} = $input; + my $result = $self->YYParse(yylex => \&lexer, yyerror => \&error); + return $result; +} |
