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 {
'&' | '*' | '+' | '-' | '~' | '!'
}