[cig-commits] r5998 - in cs/babel/trunk/buffy: . examples
leif at geodynamics.org
leif at geodynamics.org
Sat Feb 10 06:13:36 PST 2007
Author: leif
Date: 2007-02-10 06:13:36 -0800 (Sat, 10 Feb 2007)
New Revision: 5998
Modified:
cs/babel/trunk/buffy/examples/example-9-2.bff
cs/babel/trunk/buffy/gram.y
cs/babel/trunk/buffy/scan.l
Log:
Implemented operator precedence by copying & pasting some lightly
edited rules from Jeff Lee's C grammar. This has the side-effect of
introducing some C features into the language:
* modern assignment operators (e.g., += instead of =+)
* bitwise negation (~) and exclusive-or (^) operators
* "&&" and "||" operators
Modified: cs/babel/trunk/buffy/examples/example-9-2.bff
===================================================================
--- cs/babel/trunk/buffy/examples/example-9-2.bff 2007-02-10 12:58:05 UTC (rev 5997)
+++ cs/babel/trunk/buffy/examples/example-9-2.bff 2007-02-10 14:13:36 UTC (rev 5998)
@@ -17,9 +17,9 @@
a = n+1 ;
c = i = 0;
while (i<n) {
- c =+ v[i] *10;
+ c += v[i] *10;
v[i++] = c%a;
- c =/ a--;
+ c /= a--;
}
putchar(c+'0');
Modified: cs/babel/trunk/buffy/gram.y
===================================================================
--- cs/babel/trunk/buffy/gram.y 2007-02-10 12:58:05 UTC (rev 5997)
+++ cs/babel/trunk/buffy/gram.y 2007-02-10 14:13:36 UTC (rev 5998)
@@ -6,6 +6,9 @@
%token NAME CONSTANT CHAR_CONSTANT STRING_CONSTANT
%token INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
+%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
+%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
+%token XOR_ASSIGN OR_ASSIGN
%token EXTRN AUTO
@@ -50,15 +53,14 @@
| name ':' statement
| CASE constant ':' statement
| '{' statement_list '}'
- | IF '(' rvalue ')' statement
- | IF '(' rvalue ')' statement ELSE statement
- | WHILE '(' rvalue ')' statement
- | SWITCH rvalue statement
- | GOTO rvalue ';'
+ | IF '(' expr ')' statement
+ | IF '(' expr ')' statement ELSE statement
+ | WHILE '(' expr ')' statement
+ | SWITCH expr statement
+ | GOTO expr ';'
| RETURN ';'
- | RETURN rvalue ';'
- | rvalue ';'
- | ';'
+ | RETURN expr ';'
+ | expression_statement
;
decl_list
@@ -81,70 +83,145 @@
| statement_list statement
;
-rvalue
- : '(' rvalue ')'
- | lvalue
+expression_statement
+ : ';'
+ | expr ';'
+ ;
+
+/* expressions */
+
+name
+ : NAME
+ ;
+
+constant
+ : CONSTANT
+ | CHAR_CONSTANT
+ | STRING_CONSTANT
+ ;
+
+primary_expr
+ : name
| constant
- | lvalue assign rvalue
- | inc_dec lvalue
- | lvalue inc_dec
- | '-' rvalue
- | '!' rvalue
- | '&' lvalue
- | rvalue binary rvalue
- | rvalue '?' rvalue ':' rvalue
- | rvalue '(' ')'
- | rvalue '(' rvalue_list ')'
+ | '(' expr ')'
;
-rvalue_list
- : rvalue
- | rvalue_list ',' rvalue
+postfix_expr
+ : primary_expr
+ | postfix_expr '[' expr ']'
+ | postfix_expr '(' ')'
+ | postfix_expr '(' argument_expr_list ')'
+ | postfix_expr INC_OP
+ | postfix_expr DEC_OP
;
-assign
- : '='
- | '=' binary
+argument_expr_list
+ : assignment_expr
+ | argument_expr_list ',' assignment_expr
;
-inc_dec
- : INC_OP
- | DEC_OP
+unary_expr
+ : postfix_expr
+ | unary_operator unary_expr
;
-binary
- : '|'
- | '&'
- | EQ_OP
- | NE_OP
- | '<'
- | LE_OP
- | '>'
- | GE_OP
- | LEFT_OP
- | RIGHT_OP
+unary_operator
+ : '&'
+ | '*'
+ | '+'
| '-'
- | '+'
- | '%'
- | '*'
- | '/'
+ | '~'
+ | '!'
+ | INC_OP
+ | DEC_OP
;
-lvalue
- : name
- | '*' rvalue
- | lvalue '[' rvalue ']' /* should be "rvalue[rvalue]", but this leads to 36 reduce/reduce conflicts */
+multiplicative_expr
+ : unary_expr
+ | multiplicative_expr '*' unary_expr
+ | multiplicative_expr '/' unary_expr
+ | multiplicative_expr '%' unary_expr
;
-constant
- : CONSTANT
- | CHAR_CONSTANT
- | STRING_CONSTANT
+additive_expr
+ : multiplicative_expr
+ | additive_expr '+' multiplicative_expr
+ | additive_expr '-' multiplicative_expr
;
-name
- : NAME
+shift_expr
+ : additive_expr
+ | shift_expr LEFT_OP additive_expr
+ | shift_expr RIGHT_OP additive_expr
;
+
+relational_expr
+ : shift_expr
+ | relational_expr '<' shift_expr
+ | relational_expr '>' shift_expr
+ | relational_expr LE_OP shift_expr
+ | relational_expr GE_OP shift_expr
+ ;
+
+equality_expr
+ : relational_expr
+ | equality_expr EQ_OP relational_expr
+ | equality_expr NE_OP relational_expr
+ ;
+
+and_expr
+ : equality_expr
+ | and_expr '&' equality_expr
+ ;
+
+exclusive_or_expr
+ : and_expr
+ | exclusive_or_expr '^' and_expr
+ ;
+
+inclusive_or_expr
+ : exclusive_or_expr
+ | inclusive_or_expr '|' exclusive_or_expr
+ ;
+
+logical_and_expr
+ : inclusive_or_expr
+ | logical_and_expr AND_OP inclusive_or_expr
+ ;
+
+logical_or_expr
+ : logical_and_expr
+ | logical_or_expr OR_OP logical_and_expr
+ ;
+
+conditional_expr
+ : logical_or_expr
+ | logical_or_expr '?' logical_or_expr ':' conditional_expr
+ ;
+
+assignment_expr
+ : conditional_expr
+ | unary_expr assignment_operator assignment_expr
+ ;
+
+assignment_operator
+ : '='
+ | MUL_ASSIGN
+ | DIV_ASSIGN
+ | MOD_ASSIGN
+ | ADD_ASSIGN
+ | SUB_ASSIGN
+ | LEFT_ASSIGN
+ | RIGHT_ASSIGN
+ | AND_ASSIGN
+ | XOR_ASSIGN
+ | OR_ASSIGN
+ ;
+
+expr
+ : assignment_expr
+ ;
+
%%
#include <stdio.h>
Modified: cs/babel/trunk/buffy/scan.l
===================================================================
--- cs/babel/trunk/buffy/scan.l 2007-02-10 12:58:05 UTC (rev 5997)
+++ cs/babel/trunk/buffy/scan.l 2007-02-10 14:13:36 UTC (rev 5998)
@@ -28,10 +28,22 @@
\"(\\.|[^\\"])*\" { count(); return(STRING_CONSTANT); }
+">>=" { count(); return(RIGHT_ASSIGN); }
+"<<=" { count(); return(LEFT_ASSIGN); }
+"+=" { count(); return(ADD_ASSIGN); }
+"-=" { count(); return(SUB_ASSIGN); }
+"*=" { count(); return(MUL_ASSIGN); }
+"/=" { count(); return(DIV_ASSIGN); }
+"%=" { count(); return(MOD_ASSIGN); }
+"&=" { count(); return(AND_ASSIGN); }
+"^=" { count(); return(XOR_ASSIGN); }
+"|=" { count(); return(OR_ASSIGN); }
">>" { count(); return(RIGHT_OP); }
"<<" { count(); return(LEFT_OP); }
"++" { count(); return(INC_OP); }
"--" { count(); return(DEC_OP); }
+"&&" { count(); return(AND_OP); }
+"||" { count(); return(OR_OP); }
"<=" { count(); return(LE_OP); }
">=" { count(); return(GE_OP); }
"==" { count(); return(EQ_OP); }
@@ -48,6 +60,7 @@
"]" { count(); return(']'); }
"&" { count(); return('&'); }
"!" { count(); return('!'); }
+"~" { count(); return('~'); }
"-" { count(); return('-'); }
"+" { count(); return('+'); }
"*" { count(); return('*'); }
@@ -55,6 +68,7 @@
"%" { count(); return('%'); }
"<" { count(); return('<'); }
">" { count(); return('>'); }
+"^" { count(); return('^'); }
"|" { count(); return('|'); }
"?" { count(); return('?'); }
More information about the cig-commits
mailing list