Author: kjs
Date: Thu Feb 21 11:50:59 2008
New Revision: 25946
Modified:
trunk/languages/c99/src/parser/actions.pm
trunk/languages/c99/src/parser/grammar.pg
Log:
[c99]
+ finish operator table
+ finish some other rules.
+ grammar mostly complete now. Needs testing and refactoring a bit.
Modified: trunk/languages/c99/src/parser/actions.pm
==============================================================================
--- trunk/languages/c99/src/parser/actions.pm (original)
+++ trunk/languages/c99/src/parser/actions.pm Thu Feb 21 11:50:59 2008
@@ -15,7 +15,7 @@
=end comments
-class C::Grammar::Actions;
+class C99::Grammar::Actions;
method TOP($/) {
my $past := PAST::Block.new( :blocktype('declaration'), :node( $/ ) );
Modified: trunk/languages/c99/src/parser/grammar.pg
==============================================================================
--- trunk/languages/c99/src/parser/grammar.pg (original)
+++ trunk/languages/c99/src/parser/grammar.pg Thu Feb 21 11:50:59 2008
@@ -497,15 +497,66 @@
proto 'infix:||' is precedence('1') { ... }
+proto 'infix:&&' is tighter('infix:||') { ... }
+
+proto 'infix:|' is tighter('infix:&&') { ... }
+
+proto 'infix:^' is tighter('infix:|') { ... }
+
+proto 'infix:&' is tighter('infix:^') { ... }
+
+proto 'infix:==' is tighter('infix:&') { ... }
+proto 'infix:!=' is equal('infix:==') { ... }
+
+proto 'infix:<' is tighter('infix:==') { ... }
+proto 'infix:>' is equal('infix:<') { ... }
+proto 'infix:>=' is equal('infix:<') { ... }
+proto 'infix:<=' is equal('infix:<') { ... }
+
+proto 'infix:<<' is tighter('infix:==') { ... }
+proto 'infix:>>' is equal('infix:<<') { ... }
+
+proto 'infix:+' is tighter('infix:<<') { ... }
+proto 'infix:-' is equal('infix:+') { ... }
+
+proto 'infix:*' is tighter('infix:+') { ... }
+proto 'infix:/' is equal('infix:*') { ... }
+proto 'infix:%' is equal('infix:*') { ... }
+
proto 'term:' is parsed(&cast_expression) { ... }
rule postfix_expression {
- <primary_expression>
+ [
+ | <primary_expression>
+ | '(' <type_name> ')' '{' <initializer_list> [',']? '}'
+ ]
+ <postfix_expression_suffix>
+}
+
+rule postfix_expression_suffix {
+ | '[' <expression> ']'
+ | '(' <argument_expression_list>? ')'
+ | '.' <identifier>
+ | '->' <identifier>
+ | '++'
+ | '--'
+}
+
+rule argument_expression_list {
+ <assignment_expression> [',' <assignment_expression>]*
}
rule unary_expression {
- <postfix_expression>
+ | <postfix_expression>
+ | ['++'|'--'] <unary_expression>
+ | <unary_operator> <cast_expression>
+ | 'sizeof' <unary_expression>
+ | 'sizeof' '(' <type_name> ')'
+}
+
+rule unary_operator {
+ '&' | '*' | '+' | '-' | '~' | '!'
}
rule cast_expression {