aboutsummaryrefslogtreecommitdiff
path: root/challenge-259
diff options
context:
space:
mode:
authorAdam Russell <ac.russell@live.com>2024-03-10 19:29:29 -0400
committerAdam Russell <ac.russell@live.com>2024-03-10 19:29:29 -0400
commit0e01eaf0f3199e33e8a947991b96290321b42d67 (patch)
tree791a927bf21896e40497eddbf81307d2de43777d /challenge-259
parent4ede4148a206665a6cd242aa6c1fd2f4d4b5f2e2 (diff)
downloadperlweeklychallenge-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.pm52
-rw-r--r--challenge-259/adam-russell/perl/ch-2.yp68
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;
+}