Skip to content

Commit

Permalink
[Yapsi] binding now parses
Browse files Browse the repository at this point in the history
  • Loading branch information
Carl Masak committed Apr 1, 2010
1 parent 94954df commit ee0839a
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lib/Yapsi.pm
Expand Up @@ -3,13 +3,14 @@ use v6;
grammar Yapsi::Perl6::Grammar {
regex TOP { ^ <statement> ** ';' $ }
token statement { <expression> || '' }
token expression { <assignment> || <variable> || <literal>
token expression { <assignment> || <binding> || <variable> || <literal>
|| <declaration> || <saycall> }
token lvalue { <declaration> || <variable> }
token variable { '$' \w+ }
token literal { \d+ }
rule declaration { 'my' <variable> }
rule assignment { <lvalue> '=' <expression> }
rule binding { <lvalue> ':=' <expression> }
rule saycall { 'say' <expression> } # very temporary solution
}

Expand All @@ -22,7 +23,7 @@ multi sub find-vars(Match $/, 'statement') {
}

multi sub find-vars(Match $/, 'expression') {
for <variable declaration assignment saycall> -> $subrule {
for <assignment binding variable declaration saycall> -> $subrule {
if $/{$subrule} -> $e {
find-vars($e, $subrule);
}
Expand Down Expand Up @@ -59,6 +60,11 @@ multi sub find-vars(Match $/, 'assignment') {
find-vars($<expression>, 'expression');
}

multi sub find-vars(Match $/, 'binding') {
find-vars($<lvalue>, 'lvalue');
find-vars($<expression>, 'expression');
}

multi sub find-vars(Match $/, 'saycall') {
find-vars($<expression>, 'expression');
}
Expand Down
4 changes: 4 additions & 0 deletions t/yapsi/parse.t
Expand Up @@ -17,6 +17,8 @@ my @programs-that-parse =
'my $a = 42;',
'my $a; $a = 42;',
'my $a; my $a; my $a',
'my $a := 42; my $b = $a;',
'my $a; my $b := $a; $a = 42',
'my $a; say $a',
;

Expand All @@ -35,6 +37,8 @@ my @programs-that-don't-parse = # '
'$a; my $a',
'my $a =',
'$a = 42',
'42 = my $a',
'42 := my $a',
'say $a',
'say $a; my $a',
;
Expand Down

0 comments on commit ee0839a

Please sign in to comment.