Skip to content

Commit

Permalink
Perlito5 - parser - add 'Perlito5::AST::Given'
Browse files Browse the repository at this point in the history
  • Loading branch information
fglock committed Nov 12, 2012
1 parent 66ec858 commit 7bc739e
Show file tree
Hide file tree
Showing 6 changed files with 284 additions and 56 deletions.
3 changes: 2 additions & 1 deletion TODO-perlito5
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ TODO list for Perlito5

-- create __DATA__

-- "given" statement not implemented
-- "default" statement not implemented

-- compile-time eval() is not bound to the "program" environment, but to the "compiler" environment instead
Expand Down Expand Up @@ -146,6 +145,8 @@ TODO list for Perlito5

* Perl5 backend

-- "given" statement not implemented

-- check that \(@a) and \@a have different meanings

-- ${^NAME} needs curly-escaping
Expand Down
205 changes: 159 additions & 46 deletions html/perlito5.js

Large diffs are not rendered by default.

104 changes: 98 additions & 6 deletions perlito5.pl
Original file line number Diff line number Diff line change
Expand Up @@ -1950,16 +1950,16 @@ sub Perlito5::Expression::exp_parse {
((my @Statement_chars) = (9, 8, 7, 6, 5, 4, 3, 2, 1));
((my %Statement) = ('if', sub {
Perlito5::Grammar->if($_[0], $_[1])
}, 'unless', sub {
Perlito5::Grammar->unless($_[0], $_[1])
}, 'when', sub {
Perlito5::Grammar->when($_[0], $_[1])
}, 'for', sub {
Perlito5::Grammar->for($_[0], $_[1])
}, 'while', sub {
Perlito5::Grammar->while($_[0], $_[1])
}, 'when', sub {
Perlito5::Grammar->when($_[0], $_[1])
}, 'while', sub {
Perlito5::Grammar->while($_[0], $_[1])
}, 'given', sub {
Perlito5::Grammar->given($_[0], $_[1])
}, 'unless', sub {
Perlito5::Grammar->unless($_[0], $_[1])
}));
sub Perlito5::Expression::add_statement {
((my $name) = shift());
Expand Down Expand Up @@ -2859,6 +2859,87 @@ sub Perlito5::Grammar::while {
}))));
($tmp ? $MATCH : 0)
};
sub Perlito5::Grammar::given {
((my $grammar) = $_[0]);
((my $str) = $_[1]);
((my $pos) = $_[2]);
((my $MATCH) = {'str', $str, 'from', $pos, 'to', $pos});
((my $tmp) = (((do {
((my $pos1) = $MATCH->{'to'});
((do {
((((((((((((((((((('g' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'}))))) && ((('i' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((('v' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((('e' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((('n' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((do {
((my $m2) = $grammar->opt_ws($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
1
}
else {
0
}
}))) && ((('(' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((do {
((my $m2) = Perlito5::Expression->paren_parse($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
($MATCH->{'Perlito5::Expression.paren_parse'} = $m2);
1
}
else {
0
}
}))) && (((')' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((do {
((my $m2) = $grammar->opt_ws($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
1
}
else {
0
}
}))) && ((('{' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((do {
((my $m2) = $grammar->opt_ws($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
1
}
else {
0
}
}))) && ((do {
((my $m2) = Perlito5::Grammar->exp_stmts($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
($MATCH->{'Perlito5::Grammar.exp_stmts'} = $m2);
1
}
else {
0
}
}))) && ((do {
((my $m2) = $grammar->opt_ws($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
1
}
else {
0
}
}))) && ((('}' eq substr($str, $MATCH->{'to'}, 1)) && (($MATCH->{'to'} = (1 + $MATCH->{'to'})))))) && ((do {
((my $m2) = $grammar->opt_ws($str, $MATCH->{'to'}));
if ($m2) {
($MATCH->{'to'} = $m2->{'to'});
1
}
else {
0
}
}))) && ((do {
($MATCH->{'capture'} = Perlito5::AST::Given->new('cond', Perlito5::Match::flat($MATCH->{'Perlito5::Expression.paren_parse'}), 'body', Perlito5::AST::Lit::Block->new('stmts', Perlito5::Match::flat($MATCH->{'Perlito5::Grammar.exp_stmts'}), 'sig', Perlito5::Match::flat($MATCH->{'Perlito5::Grammar.var_ident'}))));
1
})))
}))
}))));
($tmp ? $MATCH : 0)
};
sub Perlito5::Grammar::opt_continue_block {
((my $grammar) = $_[0]);
((my $str) = $_[1]);
Expand Down Expand Up @@ -7626,6 +7707,17 @@ sub Perlito5::AST::For::continue {
sub Perlito5::AST::For::body {
$_[0]->{ 'body'}
};
package Perlito5::AST::Given;
sub Perlito5::AST::Given::new {
((my $class) = shift());
bless({@_}, $class)
};
sub Perlito5::AST::Given::cond {
$_[0]->{ 'cond'}
};
sub Perlito5::AST::Given::body {
$_[0]->{ 'body'}
};
package Perlito5::AST::Decl;
sub Perlito5::AST::Decl::new {
((my $class) = shift());
Expand Down
7 changes: 7 additions & 0 deletions src5/lib/Perlito5/AST.pm
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,13 @@ sub body { $_[0]->{body} }



package Perlito5::AST::Given;
sub new { my $class = shift; bless {@_}, $class }
sub cond { $_[0]->{cond} }
sub body { $_[0]->{body} }



package Perlito5::AST::Decl;
sub new { my $class = shift; bless {@_}, $class }
sub decl { $_[0]->{decl} }
Expand Down
6 changes: 3 additions & 3 deletions src5/lib/Perlito5/Expression.pm
Original file line number Diff line number Diff line change
Expand Up @@ -910,11 +910,11 @@ sub exp_parse {
my @Statement_chars = (9, 8, 7, 6, 5, 4, 3, 2, 1);
my %Statement = (
'if' => sub { Perlito5::Grammar->if($_[0], $_[1]) },
'unless' => sub { Perlito5::Grammar->unless($_[0], $_[1]) },
'when' => sub { Perlito5::Grammar->when($_[0], $_[1]) },
'for' => sub { Perlito5::Grammar->for($_[0], $_[1]) },
'while' => sub { Perlito5::Grammar->while($_[0], $_[1]) },
'when' => sub { Perlito5::Grammar->when($_[0], $_[1]) },
'while' => sub { Perlito5::Grammar->while($_[0], $_[1]) },
'given' => sub { Perlito5::Grammar->given($_[0], $_[1]) },
'unless' => sub { Perlito5::Grammar->unless($_[0], $_[1]) },
);

sub add_statement {
Expand Down
15 changes: 15 additions & 0 deletions src5/lib/Perlito5/Grammar/Control.pm
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,21 @@ token while {
}
};

token given {
given <.opt_ws> '(' <Perlito5::Expression.paren_parse> ')' <.opt_ws>
'{' <.opt_ws>
<Perlito5::Grammar.exp_stmts>
<.opt_ws>
'}' <.opt_ws>
{
$MATCH->{capture} = Perlito5::AST::Given->new(
cond => Perlito5::Match::flat($MATCH->{"Perlito5::Expression.paren_parse"}),
body => Perlito5::AST::Lit::Block->new( stmts => Perlito5::Match::flat($MATCH->{"Perlito5::Grammar.exp_stmts"}), sig => Perlito5::Match::flat($MATCH->{"Perlito5::Grammar.var_ident"}) ),
)
}
};


token opt_continue_block {
'continue' <.opt_ws>
'{' <.opt_ws>
Expand Down

0 comments on commit 7bc739e

Please sign in to comment.