[cig-commits] r6987 - cs/spike/trunk

leif at geodynamics.org leif at geodynamics.org
Mon May 28 17:24:45 PDT 2007


Author: leif
Date: 2007-05-28 17:24:45 -0700 (Mon, 28 May 2007)
New Revision: 6987

Modified:
   cs/spike/trunk/gram.y
Log:
Reverted my recent simplifications to the grammar (r6535) -- I've
decided that they were a mistake (or at least irrelevant).  Obsessing
over the syntax/grammar is such a distraction... :-(


Modified: cs/spike/trunk/gram.y
===================================================================
--- cs/spike/trunk/gram.y	2007-05-29 00:06:29 UTC (rev 6986)
+++ cs/spike/trunk/gram.y	2007-05-29 00:24:45 UTC (rev 6987)
@@ -177,8 +177,10 @@
 	;
 
 declaration_specifiers
-	: declspec                           { CHECK($$ = declaration_specifiers(Py_None, $1)); }
-	| declaration_specifiers declspec    { CHECK($$ = declaration_specifiers($1, $2)); }
+	: storage_class_specifier                           { CHECK($$ = declaration_specifiers($1, Py_None)); }
+	| storage_class_specifier declaration_specifiers    { CHECK($$ = declaration_specifiers($1, $2)); }
+	| type_specifier                                    { CHECK($$ = declaration_specifiers($1, Py_None)); }
+	| type_specifier declaration_specifiers             { CHECK($$ = declaration_specifiers($1, $2)); }
 	;
 
 init_declarator_list
@@ -191,13 +193,16 @@
 	| declarator '=' initializer
 	;
 
-declspec
+storage_class_specifier
 	: TYPEDEF
 	| EXTERN
 	| STATIC
 	| AUTO
 	| REGISTER
-	| CHAR
+	;
+
+type_specifier
+	: CHAR
 	| SHORT
 	| INT
 	| LONG
@@ -233,7 +238,7 @@
 	;
 
 struct_declaration
-	: declaration_specifiers struct_declarator_list ';'
+	: type_specifier_list struct_declarator_list ';'
 	;
 
 struct_declarator_list
@@ -264,31 +269,31 @@
 	;
 
 declarator
-	: pointer                { CHECK($$ = pointer_declarator($1, empty_declarator())); }
-	| declarator2
+	: declarator2
 	| pointer declarator2    { CHECK($$ = pointer_declarator($1, $2)); }
 	;
 
 declarator2
-	: identifier                { CHECK($$ = name_declarator($1)); }
-	| '(' declarator ')'        { $$ = $2; }
-	| '[' ']'                   { CHECK($$ = array_declarator(empty_declarator(), Py_None)); }
-	| '[' constant_expr ']'     { CHECK($$ = array_declarator(empty_declarator(), $2)); }
-	| declarator2 '[' ']'       { CHECK($$ = array_declarator($1, Py_None)); }
+	: identifier             { CHECK($$ = name_declarator($1)); }
+	| '(' declarator ')'     { $$ = $2; }
+	| declarator2 '[' ']'    { CHECK($$ = array_declarator($1, Py_None)); }
 	| declarator2 '[' constant_expr ']'    { CHECK($$ = array_declarator($1, $3)); }
-	| '(' ')'                   { CHECK($$ = function_declarator(empty_declarator(), empty_list())); }
-	| '(' parameter_list ')'    { CHECK($$ = function_declarator(empty_declarator(), $2)); }
-	| declarator2 '(' ')'       { CHECK($$ = function_declarator($1, empty_list())); }
-	| declarator2 '(' parameter_list ')'    { CHECK($$ = function_declarator($1, $3)); }
+	| declarator2 '(' ')'    { CHECK($$ = function_declarator($1, empty_list())); }
+	| declarator2 '(' parameter_list ')'          { CHECK($$ = function_declarator($1, $3)); }
 	;
 
 pointer
-	: '*'                                   { CHECK($$ = pointer($1, Py_None, Py_None)); }
-	| '*' declaration_specifiers            { CHECK($$ = pointer($1, $2, Py_None)); }
-	| '*' pointer                           { CHECK($$ = pointer($1, Py_None, $2)); }
-	| '*' declaration_specifiers pointer    { CHECK($$ = pointer($1, $2, $3)); }
+	: '*'                                { CHECK($$ = pointer($1, Py_None, Py_None)); }
+	| '*' type_specifier_list            { CHECK($$ = pointer($1, $2, Py_None)); }
+	| '*' pointer                        { CHECK($$ = pointer($1, Py_None, $2)); }
+	| '*' type_specifier_list pointer    { CHECK($$ = pointer($1, $2, $3)); }
 	;
 
+type_specifier_list
+	: type_specifier                        { CHECK($$ = type_specifier_list(Py_None, $1)); }
+	| type_specifier_list type_specifier    { CHECK($$ = type_specifier_list($1, $2)); }
+	;
+
 parameter_list
 	: parameter_declaration                       { CHECK($$ = parameter_list(Py_None, $1)); }
 	| parameter_list ',' parameter_declaration    { CHECK($$ = parameter_list($1, $3)); }
@@ -296,16 +301,35 @@
 	;
 
 parameter_declaration
-	: declaration_specifiers declarator    { CHECK($$ = pair($1, $2)); }
-	| declaration_specifiers               { CHECK($$ = pair($1, empty_declarator())); }
-	| declarator                           { CHECK($$ = pair(Py_None, $1)); }
+	: type_specifier_list declarator             { CHECK($$ = pair($1, $2)); }
+	| type_specifier_list abstract_declarator    { CHECK($$ = pair($1, $2)); }
+	| type_specifier_list                        { CHECK($$ = pair($1, empty_declarator())); }
+	| declarator                                 { CHECK($$ = pair(Py_None, $1)); }
 	;
 
 type_name
-	: declaration_specifiers                        { CHECK($$ = pair($1, empty_declarator())); }
-	| declaration_specifiers declarator             { CHECK($$ = pair($1, $2)); }
+	: type_specifier_list                        { CHECK($$ = pair($1, empty_declarator())); }
+	| type_specifier_list abstract_declarator    { CHECK($$ = pair($1, $2)); }
 	;
 
+abstract_declarator
+	: pointer                         { CHECK($$ = pointer_declarator($1, empty_declarator())); }
+	| abstract_declarator2
+	| pointer abstract_declarator2    { CHECK($$ = pointer_declarator($1, $2)); }
+	;
+
+abstract_declarator2
+	: '(' abstract_declarator ')'     { CHECK($$ = $2); }
+	| '[' ']'                         { CHECK($$ = array_declarator(empty_declarator(), Py_None)); }
+	| '[' constant_expr ']'           { CHECK($$ = array_declarator(empty_declarator(), $2)); }
+	| abstract_declarator2 '[' ']'    { CHECK($$ = array_declarator($1, Py_None)); }
+	| abstract_declarator2 '[' constant_expr ']'    { CHECK($$ = array_declarator($1, $3)); }
+	| '(' ')'                         { CHECK($$ = function_declarator(empty_declarator(), empty_list())); }
+	| '(' parameter_list ')'          { CHECK($$ = function_declarator(empty_declarator(), $2)); }
+	| abstract_declarator2 '(' ')'    { CHECK($$ = function_declarator($1, empty_list())); }
+	| abstract_declarator2 '(' parameter_list ')'    { CHECK($$ = function_declarator($1, $3)); }
+	;
+
 initializer
 	: assignment_expr
 	| '{' initializer_list '}'
@@ -363,7 +387,6 @@
 	: labeled_statement
 	| compound_statement
 	| expression_statement
-	| declaration
 	| selection_statement
 	| iteration_statement
 	| jump_statement
@@ -376,13 +399,20 @@
 	;
 
 compound_statement
-	: '{' '}'                   { CHECK($$ = statement_list($1, Py_None, Py_None)); }
-	| '{' statement_list '}'    { CHECK($$ = $2); }
+	: '{' '}'                                    { CHECK($$ = compound_statement($1, Py_None, Py_None)); }
+	| '{' statement_list '}'                     { CHECK($$ = compound_statement($1, Py_None, $2)); }
+	| '{' declaration_list '}'                   { CHECK($$ = compound_statement($1, $2, Py_None)); }
+	| '{' declaration_list statement_list '}'    { CHECK($$ = compound_statement($1, $2, $3)); }
 	;
 
+declaration_list
+	: declaration                     { CHECK($$ = declaration_list(Py_None, $1)); }
+	| declaration_list declaration    { CHECK($$ = declaration_list($1, $2)); }
+	;
+
 statement_list
-	: statement                   { CHECK($$ = statement_list(Py_None, Py_None, $1)); }
-	| statement_list statement    { CHECK($$ = statement_list(Py_None, $1, $2)); }
+	: statement                   { CHECK($$ = statement_list(Py_None, $1)); }
+	| statement_list statement    { CHECK($$ = statement_list($1, $2)); }
 	;
 
 expression_statement
@@ -398,9 +428,16 @@
 	;
 
 iteration_statement
-	: WHILE '(' expr ')' statement                 { CHECK($$ = while_statement($1, $3, $5)); }
+	: WHILE '(' expr ')' statement                    { CHECK($$ = while_statement($1, $3, $5)); }
 	| DO statement WHILE '(' expr ')' ';'
-	| FOR '(' statement_list expr ')' statement    { CHECK($$ = pass_statement($1)); }
+	| FOR '(' ';' ';' ')' statement
+	| FOR '(' ';' ';' expr ')' statement
+	| FOR '(' ';' expr ';' ')' statement
+	| FOR '(' ';' expr ';' expr ')' statement
+	| FOR '(' expr ';' ';' ')' statement
+	| FOR '(' expr ';' ';' expr ')' statement
+	| FOR '(' expr ';' expr ';' ')' statement
+	| FOR '(' expr ';' expr ';' expr ')' statement
 	;
 
 jump_statement
@@ -428,14 +465,9 @@
 
 function_body
 	: compound_statement
-	| function_prologue compound_statement    { CHECK($$ = $2); /*TODO*/ }
+	| declaration_list compound_statement
 	;
 
-function_prologue
-	: declaration
-	| function_prologue declaration
-	;
-
 identifier
 	: IDENTIFIER    { CHECK($$ = $1); }
 	;



More information about the cig-commits mailing list