Author: kjs
Date: Fri Feb 22 04:35:33 2008
New Revision: 25986
Modified:
trunk/languages/c99/src/parser/actions.pm
trunk/languages/c99/src/parser/grammar.pg
trunk/languages/c99/t/spi.t
Log:
[c99]
- add if, while and do-while statements
- add tests for this.
- make compound-statements create blocks, instead of stmts nodes; they define a
new scope.
Modified: trunk/languages/c99/src/parser/actions.pm
==============================================================================
--- trunk/languages/c99/src/parser/actions.pm (original)
+++ trunk/languages/c99/src/parser/actions.pm Fri Feb 22 04:35:33 2008
@@ -80,14 +80,36 @@
}
method compound_statement($/) {
- #my $past := PAST::Block.new( :blocktype('immediate'), :node($/) );
- my $past := PAST::Stmts.new( :node($/) );
+ my $past := PAST::Block.new( :blocktype('immediate'), :node($/) );
+ #my $past := PAST::Stmts.new( :node($/) );
for $<block_item> {
$past.push( $($_) );
}
make $past;
}
+method if_statement($/) {
+ my $cond := $( $<expression> );
+ my $then := $( $<statement> );
+ my $past := PAST::Op.new( $cond, $then, :pasttype('if'), :node($/) );
+ if $<else> {
+ $past.push( $( $<else>[0] ) );
+ }
+ make $past;
+}
+
+method do_while_statement($/) {
+ my $cond := $( $<expression> );
+ my $body := $( $<statement> );
+ make PAST::Op.new( $cond, $body, :pasttype('repeat_while'), :node($/) );
+}
+
+method while_statement($/) {
+ my $cond := $( $<expression> );
+ my $body := $( $<statement> );
+ make PAST::Op.new( $cond, $body, :pasttype('while'), :node($/) );
+}
+
method block_item($/, $key) {
make $( $/{$key} );
}
Modified: trunk/languages/c99/src/parser/grammar.pg
==============================================================================
--- trunk/languages/c99/src/parser/grammar.pg (original)
+++ trunk/languages/c99/src/parser/grammar.pg Fri Feb 22 04:35:33 2008
@@ -260,10 +260,10 @@
| <labeled_statement>
| <compound_statement> {*} #= compound_statement
| <expression_statement> {*} #= expression_statement
- | <if_statement>
+ | <if_statement> {*} #= if_statement
| <switch_statement>
- | <while_statement>
- | <do_while_statement>
+ | <while_statement> {*} #= while_statement
+ | <do_while_statement> {*} #= do_while_statement
| <for1_statement>
| <for2_statement>
| <jump_statement>
@@ -292,6 +292,7 @@
rule if_statement {
'if' '(' <expression> ')' <statement> ['else' $<else>=<statement>]?
+ {*}
}
rule switch_statement {
@@ -300,10 +301,12 @@
rule while_statement {
'while' '(' <expression> ')' <statement>
+ {*}
}
rule do_while_statement {
'do' <statement> 'while' '(' <expression> ')' ';'
+ {*}
}
rule for1_statement {
Modified: trunk/languages/c99/t/spi.t
==============================================================================
--- trunk/languages/c99/t/spi.t (original)
+++ trunk/languages/c99/t/spi.t Fri Feb 22 04:35:33 2008
@@ -1,7 +1,27 @@
+
void main() {
- puts("1..1");
+ puts("1..4");
puts("ok 1");
+
+ if (0)
+ puts("nok 2");
+ else {
+ puts("ok 2");
+ }
+
+
+ if (1) {
+ puts("ok 3");
+ }
+ else
+ puts("nok 3");
+
+ do {
+ puts("ok 4");
+ }
+ while(0);
+
}