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 {

Reply via email to