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);
+
 }
 

Reply via email to