aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/pre_parser.mly
diff options
context:
space:
mode:
authorFrançois Pottier <francois.pottier@inria.fr>2015-10-08 01:30:18 +0200
committerFrançois Pottier <francois.pottier@inria.fr>2015-10-23 12:51:12 +0200
commit4972a6a8851dfe823a022fc3b8c7c01332a89c35 (patch)
tree1000138755e8c1b550f0e8a8169bcf0b2503079d /cparser/pre_parser.mly
parent44b910bb829f6e5920b0a51985624c345019711e (diff)
downloadcompcert-kvx-4972a6a8851dfe823a022fc3b8c7c01332a89c35.tar.gz
compcert-kvx-4972a6a8851dfe823a022fc3b8c7c01332a89c35.zip
Introduced [list] and [ilist]. Redefined [declaration_specifiers_no_type] as a left-recursive list.
This further reduces the number of states (and error states).
Diffstat (limited to 'cparser/pre_parser.mly')
-rw-r--r--cparser/pre_parser.mly33
1 files changed, 22 insertions, 11 deletions
diff --git a/cparser/pre_parser.mly b/cparser/pre_parser.mly
index 0aa884c9..e2ca8439 100644
--- a/cparser/pre_parser.mly
+++ b/cparser/pre_parser.mly
@@ -95,6 +95,21 @@ option(X):
optional(X, Y):
ioption(X) Y {}
+(* This is a standard left-recursive, possibly empty list, without
+ separators. Note that, by convention, [X*] is syntactic sugar for
+ [list(X)]. *)
+
+list(X):
+| (* empty *) {}
+| list(X) X {}
+
+(* [ilist(X)] is equivalent to [list(X)], but is marked [%inline],
+ so its definition is expanded. *)
+
+%inline ilist(X):
+| (* empty *) {}
+| list(X) X {}
+
%inline fst(X):
| x = X
{ fst x }
@@ -352,7 +367,7 @@ storage_class_specifier_no_typedef:
| REGISTER
{}
-(* [declaration_specifiers_no_type] matches declaration specifiers
+(* [declaration_specifier_no_type] matches declaration specifiers
that do not contain either "typedef" nor type specifiers. *)
declaration_specifier_no_type:
| storage_class_specifier_no_typedef
@@ -360,10 +375,6 @@ declaration_specifier_no_type:
| function_specifier
{}
-declaration_specifiers_no_type:
-| declaration_specifier_no_type declaration_specifiers_no_type?
- {}
-
(* [declaration_specifiers_no_typedef_name] matches declaration
specifiers that contain neither "typedef" nor a typedef name
(i.e. type specifier declared using a previous "typedef
@@ -396,18 +407,18 @@ declaration_specifiers_no_typedef_name:
[parameter_declaration], which means that this is the beginning of a
parameter declaration. *)
declaration_specifiers(phantom):
-| ioption(declaration_specifiers_no_type) TYPEDEF_NAME declaration_specifiers_no_type?
-| declaration_specifiers_no_type? type_specifier_no_typedef_name declaration_specifiers_no_typedef_name?
+| ilist(declaration_specifier_no_type) TYPEDEF_NAME declaration_specifier_no_type*
+| declaration_specifier_no_type* type_specifier_no_typedef_name declaration_specifiers_no_typedef_name?
{}
(* This matches declaration_specifiers that do contains once the
"typedef" keyword. To avoid conflicts, we also encode the
constraint described in the comment for [declaration_specifiers]. *)
declaration_specifiers_typedef:
-| declaration_specifiers_no_type? TYPEDEF declaration_specifiers_no_type? TYPEDEF_NAME declaration_specifiers_no_type?
-| ioption(declaration_specifiers_no_type) TYPEDEF_NAME declaration_specifiers_no_type? TYPEDEF declaration_specifiers_no_type?
-| declaration_specifiers_no_type? TYPEDEF declaration_specifiers_no_type? type_specifier_no_typedef_name declaration_specifiers_no_typedef_name?
-| declaration_specifiers_no_type? type_specifier_no_typedef_name declaration_specifiers_no_typedef_name? TYPEDEF declaration_specifiers_no_typedef_name?
+| declaration_specifier_no_type* TYPEDEF declaration_specifier_no_type* TYPEDEF_NAME declaration_specifier_no_type*
+| ilist(declaration_specifier_no_type) TYPEDEF_NAME declaration_specifier_no_type* TYPEDEF declaration_specifier_no_type*
+| declaration_specifier_no_type* TYPEDEF declaration_specifier_no_type* type_specifier_no_typedef_name declaration_specifiers_no_typedef_name?
+| declaration_specifier_no_type* type_specifier_no_typedef_name declaration_specifiers_no_typedef_name? TYPEDEF declaration_specifiers_no_typedef_name?
{}
(* A type specifier which is not a typedef name. *)