1
#! /usr/local/bin/perl -w
9
my $parser = Parse::RecDescent->new($grammar);
13
$tree = $parser->translation_unit($text) or die "bad C code";
15
use Data::Dumper 'Dumper';
16
print Dumper [ $tree ];
30
| (primary_expression)(s) '[' expression ']'
31
| (primary_expression)(s) '(' ')'
32
| (primary_expression)(s) '(' argument_expression_list ')'
33
| (primary_expression)(s) '.' IDENTIFIER
34
| (primary_expression)(s) PTR_OP IDENTIFIER
35
| (primary_expression)(s) INC_OP
36
| (primary_expression)(s) DEC_OP
38
argument_expression_list:
39
(assignment_expression ',')(s?) assignment_expression
43
| INC_OP unary_expression
44
| DEC_OP unary_expression
45
| unary_operator cast_expression
46
| SIZEOF unary_expression
47
| SIZEOF '(' type_name ')'
59
| '(' type_name ')' cast_expression
61
multiplicative_expression:
62
(cast_expression mul_ex_op)(s?) cast_expression
64
mul_ex_op : '*' | '/' | '%'
67
(multiplicative_expression add_op)(s?) multiplicative_expression
72
(additive_expression shift_op )(s?) additive_expression
74
shift_op : LEFT_OP | RIGHT_OP
76
relational_expression:
77
(shift_expression rel_op)(s?) shift_expression
79
rel_op: '<' | '>' | LE_OP | GE_OP
82
(relational_expression eq_ex_op)(s?) relational_expression
84
eq_ex_op : EQ_OP | NE_OP
87
(equality_expression '&')(s?) equality_expression
89
exclusive_or_expression:
90
(and_expression '^')(s?) and_expression
92
inclusive_or_expression:
93
(exclusive_or_expression '|')(s?) exclusive_or_expression
95
logical_and_expression:
96
(inclusive_or_expression AND_OP)(s?) inclusive_or_expression
98
logical_or_expression:
99
(logical_and_expression OR_OP)(s?) logical_and_expression
101
conditional_expression:
102
logical_or_expression
103
| logical_or_expression '?' expression ':' conditional_expression
105
assignment_expression:
106
conditional_expression
107
| unary_expression assignment_operator assignment_expression
123
(assignment_expression ',')(s?) assignment_expression
126
conditional_expression
129
declaration_specifiers ';'
130
{ print "We have a match!\n"; }
131
| declaration_specifiers init_declarator_list ';'
133
declaration_specifiers:
134
storage_class_specifier
135
| storage_class_specifier declaration_specifiers
137
| type_specifier declaration_specifiers
139
| type_qualifier declaration_specifiers
141
init_declarator_list:
142
(init_declarator ',')(s?) init_declarator
146
| declarator '=' initializer
148
storage_class_specifier:
165
| struct_or_union_specifier
169
struct_or_union_specifier:
170
struct_or_union IDENTIFIER '{' struct_declaration_list '}'
171
| struct_or_union '{' struct_declaration_list '}'
172
| struct_or_union IDENTIFIER
178
struct_declaration_list:
179
struct_declaration(s)
182
specifier_qualifier_list struct_declarator_list ';'
184
specifier_qualifier_list:
185
type_specifier specifier_qualifier_list
187
| type_qualifier specifier_qualifier_list
190
struct_declarator_list:
191
(struct_declarator ',')(s?) struct_declarator
195
| ':' constant_expression
196
| declarator ':' constant_expression
199
ENUM '{' enumerator_list '}'
200
| ENUM IDENTIFIER '{' enumerator_list '}'
204
(enumerator ',')(s?) enumerator
208
| IDENTIFIER '=' constant_expression
215
pointer direct_declarator
221
| (IDENTIFIER)(s?) ('(' declarator ')')(s?) '[' constant_expression ']'
222
| (IDENTIFIER)(s?) ('(' declarator ')')(s?) '[' ']'
223
| (IDENTIFIER)(s?) ('(' declarator ')')(s?) '(' parameter_type_list ')'
224
| (IDENTIFIER)(s?) ('(' declarator ')')(s?) '(' identifier_list ')'
225
| (IDENTIFIER)(s?) ('(' declarator ')')(s?) '(' ')'
229
| '*' type_qualifier_list
231
| '*' type_qualifier_list pointer
238
| parameter_list ',' ELLIPSIS
241
(parameter_declaration ',')(s?) parameter_declaration
243
parameter_declaration:
244
declaration_specifiers declarator
245
| declaration_specifiers abstract_declarator
246
| declaration_specifiers
249
(IDENTIFIER ',')(s?) IDENTIFIER
252
specifier_qualifier_list
253
| specifier_qualifier_list abstract_declarator
257
| direct_abstract_declarator
258
| pointer direct_abstract_declarator
260
direct_abstract_declarator:
261
'(' abstract_declarator ')'
263
| '[' constant_expression ']'
265
| DAD '[' constant_expression ']'
267
| '(' parameter_type_list ')'
269
| DAD '(' parameter_type_list ')'
271
DAD: #macro for direct_abstract_declarator
272
( '(' abstract_declarator ')' )(s?)
274
( '[' constant_expression ']' )(s?)
276
( '(' parameter_type_list ')' )(s?)
279
assignment_expression
280
| '{' initializer_list '}'
281
| '{' initializer_list ',' '}'
284
(initializer ',')(s?) initializer
289
| expression_statement
290
| selection_statement
291
| iteration_statement
295
IDENTIFIER ':' statement
296
| CASE constant_expression ':' statement
297
| DEFAULT ':' statement
301
| '{' statement_list '}'
302
| '{' declaration_list '}'
303
| '{' declaration_list statement_list '}'
311
expression_statement:
316
IF '(' expression ')' statement
317
| IF '(' expression ')' statement ELSE statement
318
| SWITCH '(' expression ')' statement
321
WHILE '(' expression ')' statement
322
| DO statement WHILE '(' expression ')' ';'
323
| FOR '(' expression_statement expression_statement ')' statement
324
| FOR '(' expression_statement expression_statement expression ')' statement
331
| RETURN expression ';'
334
external_declaration(s)
336
external_declaration:
341
declaration_specifiers declarator declaration_list compound_statement
342
| declaration_specifiers declarator compound_statement
343
| declarator declaration_list compound_statement
344
| declarator compound_statement
349
AUTO | BREAK | CASE | CHAR | CONST |
350
CONTINUE | DEFAULT | DO | DOUBLE | ENUM |
351
EXTERN | FLOAT | FOR | GOTO | IF |
352
INT | LONG | REGISTER | RETURN | SHORT |
353
SIGNED | SIZEOF | STATIC | STRUCT | SWITCH |
354
TYPEDEF | UNION | UNSIGNED | VOID | VOLATILE |
366
CONSTANT: /[+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?/
382
IDENTIFIER: ...!reserved_word /[a-z]\w*/i
404
STRING_LITERAL: { extract_delimited($text,'"') }
409
TYPE_NAME: # NONE YET