[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