Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Basic for loops.
  • Loading branch information
arnsholt committed Nov 3, 2014
1 parent 430570e commit f28eca1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 6 deletions.
28 changes: 22 additions & 6 deletions src/Snake/Actions.nqp
Expand Up @@ -82,12 +82,7 @@ method simple-statement($/) {

method assignment($/) {
my $var := ~$<identifier>;
my %sym := $*BLOCK.symbol: $var;

if !%sym<declared> {
$*BLOCK[0].push: QAST::Var.new(:name($var), :scope<lexical>, :decl<var>);
}

self.add-declaration: $var;
make QAST::Op.new(:op<bind>,
QAST::Var.new(:name($var), :scope<lexical>),
$<EXPR>.ast);
Expand All @@ -107,6 +102,19 @@ method compound-statement:sym<if>($/) {
make $ast;
}

method compound-statement:sym<for>($/) {
my $var := ~$<identifier>;
self.add-declaration: $var;
$<suite>.ast.unshift: QAST::Op.new(:op<bind>,
QAST::Var.new(:name($var), :scope<lexical>),
QAST::Var.new(:name<$_>, :scope<lexical>));
make QAST::Op.new(:op<for>, $<EXPR>.ast,
QAST::Block.new(
QAST::Stmts.new(QAST::Var.new(:name<$_>, :scope<lexical>, :decl<param>)),
$<suite>.ast
))
}

method suite:sym<runon>($/) { make $<stmt-list>.ast; }

method suite:sym<normal>($/) {
Expand Down Expand Up @@ -144,4 +152,12 @@ method file-input($/) {

method line($/) { make $<statement>.ast if $<statement>; }

# Appendix: Utility methods
method add-declaration($var) {
my %sym := $*BLOCK.symbol: $var;
if !%sym<declared> {
$*BLOCK[0].push: QAST::Var.new(:name($var), :scope<lexical>, :decl<var>);
}
}

# vim: ft=perl6
6 changes: 6 additions & 0 deletions src/Snake/Grammar.nqp
Expand Up @@ -216,6 +216,12 @@ rule compound-statement:sym<if> {
[<.INDENT: $indent> 'else' ':' <else=.suite>]?
}

# TODO: Full destructuring assignment.
# TODO: Else part of for loop.
rule compound-statement:sym<for> {
<sym> <identifier> in <EXPR> ':' <suite>
}

proto token suite {*}
token suite:sym<runon> { <stmt-list> <.NEWLINE> }
token suite:sym<normal> {
Expand Down

0 comments on commit f28eca1

Please sign in to comment.