Author: kjs
Date: Sat Feb 23 05:28:35 2008
New Revision: 26021

Modified:
   trunk/languages/c99/src/builtins/say.pir
   trunk/languages/c99/src/parser/actions.pm
   trunk/languages/c99/src/parser/grammar.pg

Log:
[c99]

add prefix inc/dec operators
and some other stuff.

Modified: trunk/languages/c99/src/builtins/say.pir
==============================================================================
--- trunk/languages/c99/src/builtins/say.pir    (original)
+++ trunk/languages/c99/src/builtins/say.pir    Sat Feb 23 05:28:35 2008
@@ -60,6 +60,19 @@
     .return (arg)
 .end
 
+.sub 'prefix:++'
+    .param pmc arg
+    inc arg
+    .return (arg)
+.end
+
+.sub 'prefix:--'
+    .param pmc arg
+    dec arg
+    .return (arg)
+.end
+
+
 
 # Local Variables:
 #   mode: pir

Modified: trunk/languages/c99/src/parser/actions.pm
==============================================================================
--- trunk/languages/c99/src/parser/actions.pm   (original)
+++ trunk/languages/c99/src/parser/actions.pm   Sat Feb 23 05:28:35 2008
@@ -134,11 +134,40 @@
 }
 
 method for2_statement($/) {
+    my $past := PAST::Block.new( :blocktype('immediate'), :node($/) );
+    my $loop := PAST::Op.new( :pasttype('while'), :node($/) );
+
+    $past.push( $( $<declaration> ) );
+    my $body := $( $<statement> );
+
+    if $<step> {
+        my $step := $( $<step>[0] );
+    }
+    my $cond;
+    if $<cond> {
+        $cond := $( $<cond>[0] );
+    }
+    else {
+        $cond := PAST::Val.new( :returns('Integer'), :value('1'), :node($/) );
+    }
+    $loop.push($cond);
+    $loop.push($body);
 
+    $past.push($loop);
+    make $past;
 }
 
 method expression($/) {
-    make $( $<assignment_expression>[0] );
+    if +$<assignment_expression> != 1 {
+        my $past := PAST::Stmts.new( :node($/) );
+        for $<assignment_expression> {
+            $past.push( $( $_ ) );
+        }
+        make $past;
+    }
+    else {
+        make $( $<assignment_expression>[0] );
+    }
 }
 
 method expression_statement($/) {
@@ -269,6 +298,12 @@
     make $past;
 }
 
+method prefix_expression($/) {
+    my $opname := 'prefix:' ~ ~$<op>;
+    my $expr   := $( $<unary_expression> );
+    make PAST::Op.new( $expr, :name($opname), :pasttype('call'), :node($/) );
+}
+
 method primary_expression($/, $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   Sat Feb 23 05:28:35 2008
@@ -269,7 +269,7 @@
     | <while_statement> {*}           #= while_statement
     | <do_while_statement> {*}        #= do_while_statement
     | <for1_statement> {*}            #= for1_statement
-    | <for2_statement>
+    | <for2_statement> {*}            #= for2_statement
     | <jump_statement> {*}            #= jump_statement
 }
 
@@ -320,7 +320,7 @@
 }
 
 rule for2_statement {
-    'for' '(' <declaration> <expression>? ';' <expression>? ')' <statement>
+    'for' '(' <declaration> [$<cond>=<expression>]? ';' 
[$<step>=<expression>]? ')' <statement>
     {*}
 }
 
@@ -619,12 +619,17 @@
 
 rule unary_expression {
     | <postfix_expression> {*}              #= postfix_expression
-    | ['++'|'--'] <unary_expression>
+    | <prefix_expression> {*}               #= prefix_expression
     | <unary_operator> <cast_expression>
     | 'sizeof' <unary_expression>
     | 'sizeof' '(' <type_name> ')'
 }
 
+rule prefix_expression {
+    $<op>=['++'|'--'] <unary_expression>
+    {*}
+}
+
 rule unary_operator {
     '&' | '*' | '+' | '-' | '~' | '!'
 }

Reply via email to