You are on page 1of 5

/* Concrete Syntax Tree */

Productions
translation_unit = external_declaration+ ;
external_declaration = declaration | function_definition ;
function_definition = declaration_specifiers declarator declaration_l
ist? compound_statement ;
declaration_list = declaration+ ;
constant = integer_constant | floating_constant | enumeration_constant |
character_constant ;
primary_expression = identifier | constant | string_literal | tok_lpar e
xpression tok_rpar ;
postfix_expression = primary_expression
| postfix_expression tok_lbracket exp
ression tok_rbracket
| postfix_expression tok_lpar argumen
t_expression_list? tok_rpar
| postfix_expression virgula identifi
er
| postfix_expression tok_arrow identi
fier
| postfix_expression tok_plus_plus
| postfix_expression tok_minus_minus
| tok_lpar type_name tok_rpar tok_lbr
ace initializer_list tok_rbrace
| tok_lpar type_name tok_rpar tok_lbr
ace initializer_list virgula tok_rbrace ;
argument_expression_list = assignment_expression | argument_expression
_list virgula assignment_expression ;
unary_expression = postfix_expression | tok_plus_plus unary_expression
| tok_minus_minus unary_expression | unary_operator cast_expression | kw_sizeof
unary_expression | kw_sizeof tok_lpar type_name tok_rpar ;
unary_operator = tok_star | tok_plus | tok_minus | tok_tilde ;
cast_expression = unary_expression | tok_lpar type_name tok_rpar cast_ex
pression ;
multiplicative_expression = cast_expression | multiplicative_expression
tok_star cast_expression | multiplicative_expression tok_slash cast_expression
| multiplicative_expression tok_percent cast_expression ;
additive_expression = multiplicative_expression | additive_expression to
k_plus multiplicative_expression | additive_expression tok_minus multiplicative_
expression ;
shift_expression = additive_expression | shift_expression tok_lshift add
itive_expression | shift_expression tok_rshift additive_expression ;

relacional = shift_expression
| relacional menor shift_expression
| relacional maior shift_expression
| relacional menor_igual shift_expression
| relacional maior_igual shift_expression
;
igualdade = relacional
| igualdade igual relacional
| igualdade diferente relacional
;
and_expression = equality_expression | and_expression tok_amp equality_e
xpression ;
exclusive_or_expression = and_expression | exclusive_or_expression tok_c
aret and_expression ;
inclusive_or_expression = exclusive_or_expression | inclusive_or_express
ion tok_bar exclusive_or_expression ;
logical_and_expression = inclusive_or_expression | logical_and_expressio
n tok_amp_amp inclusive_or_expression ;
logical_or_expression = logical_and_expression | logical_or_expression t
ok_bar_bar logical_and_expression ;
conditional_expression = logical_or_expression | logical_or_expression t
ok_question expression tok_colon conditional_expression ;
assignment_expression = conditional_expression | unary_expression assign
ment_operator assignment_expression ;
assignment_operator = tok_eq | tok_star_eq | tok_slash_eq | tok_percent_
eq | tok_plus_eq | tok_minus_eq | tok_lshift_eq | tok_rshift_eq | tok_amp_eq | t
ok_caret_eq | tok_bar_eq ;
expression = assignment_expression | expression virgula assignment_expre
ssion ;
constant_expression = conditional_expression ;
declaration = declaration_specifiers init_declarator_list? tok_semicolon
;
declaration_specifiers = storage_class_specifier declaration_specifiers?

| type_specifier declara
tion_specifiers?
| type_qualifier declara
tion_specifiers?
| function_specifier dec
laration_specifiers?
;
init_declarator_list = init_declarator | init_declarator_list virgula in
it_declarator ;
init_declarator = declarator | declarator tok_eq initializer ;
storage_class_specifier = kw_typedef | kw_extern | kw_static | kw_auto |
kw_register ;
type_specifier = kw_void | kw_char | kw_short | kw_int | kw_long | kw_fl
oat | kw_double | kw_signed | kw_unsigned | kw_bool | kw_complex | kw_imaginary
| struct_or_union_specifier | enum_specifier | typedef_name ;
struct_or_union_specifier = kw_struct identifier? tok_lbrace struct_decl
aration_list tok_rbrace
| kw_struct identifier

| kw_union identifier?
tok_lbrace struct_declaration_list tok_rbrace
| kw_union identifier
;
struct_declaration_list = struct_declaration+ ;
struct_declaration = specifier_qualifier_list struct_declarator_list tok
_semicolon ;
specifier_qualifier_list = type_specifier specifier_qualifier_list? | t
ype_qualifier specifier_qualifier_list? ;
struct_declarator_list = struct_declarator | struct_declarator_list virg
ula struct_declarator ;
struct_declarator = declarator | declarator? tok_colon constant_expressi
on ;
enum_specifier = kw_enum identifier? tok_lbrace enumerator_list tok_rbra
ce
| kw_enum identifier? tok_lbrace enumerator_l
ist virgula tok_rbrace
| kw_enum identifier
;
enumerator_list = enumerator | enumerator_list virgula enumerator ;
enumerator = identifier | identifier tok_eq constant_expression ;
type_qualifier = kw_const | kw_restrict | kw_volatile ;
function_specifier = kw_inline ;
declarator = pointer? direct_declarator ;
direct_declarator = identifier
| tok_lpar declarator tok_rpar
| direct_declarator tok_lbracket type_
qualifier_list? assignment_expression? tok_rbracket
| direct_declarator tok_lbracket kw_st
atic type_qualifier_list? assignment_expression tok_rbracket
| direct_declarator tok_lbracket type_
qualifier_list kw_static assignment_expression tok_rbracket
| direct_declarator tok_lbracket type_
qualifier_list? tok_star tok_rbracket
| direct_declarator tok_lpar parameter
_type_list tok_rpar
| direct_declarator tok_lpar identifie
r_list? tok_rpar
;
pointer = tok_star type_qualifier_list? | tok_star type_qualifier_list?
pointer ;
type_qualifier_list = type_qualifier+ ;
parameter_type_list = parameter_list | parameter_list virgula tok_elipsi
s ;
parameter_list = parameter_declaration | parameter_list virgula parame
ter_declaration;
parameter_declaration = declaration_specifiers declarator | declaration_
specifiers abstract_declarator? ;
identifier_list = identifier | identifier_list virgula identifier ;
type_name = specifier_qualifier_list abstract_declarator? ;
abstract_declarator = pointer | pointer? direct_abstract_declarator ;
direct_abstract_declarator = tok_lpar abstract_declarator tok_rpar
| direct_abstract_dec
larator? tok_lbracket assignment_expression? tok_rbracket
| direct_abstract_dec
larator? tok_lbracket tok_star tok_rbracket
| direct_abstract_dec
larator? tok_lpar parameter_type_list? tok_rpar
;
typedef_name = typedef_identifier ;
initializer = assignment_expression | tok_lbrace initializer_list tok_rb
race | tok_lbrace initializer_list virgula tok_rbrace ;
initializer_list = designation? initializer | initializer_list virgula d
esignation? initializer ;
designation = designator_list tok_eq ;
designator_list = designator+ ;
designator = tok_lbracket constant_expression tok_rbracket | virgula ide
ntifier ;
statement = no_dangling_statement | dangling_statement ;
no_dangling_statement = compound_statement | expression_statement | jump
_statement | kw_if tok_lpar expression tok_rpar no_dangling_statement kw_else [o
ther]:no_dangling_statement ;
dangling_statement = labeled_statement | selection_statement | iteration
_statement ;
labeled_statement = identifier tok_colon statement | kw_case constant_e
xpression tok_colon statement | kw_default tok_colon statement ;
compound_statement = tok_lbrace block_item_list? tok_rbrace ;
block_item_list = block_item+ ;
block_item = declaration | statement ;
expression_statement = expression? tok_semicolon ;
selection_statement = kw_if tok_lpar expression tok_rpar statement
| kw_if tok_lpar expression tok_
rpar no_dangling_statement kw_else [other]:dangling_statement
| kw_switch tok_lpar expression
tok_rpar statement
;
iteration_statement = kw_while tok_lpar expression tok_rpar statement
| kw_do statement kw_while tok_l
par expression tok_rpar tok_semicolon
| kw_for tok_lpar [declaration]:
expression? [a]:tok_semicolon [condition]:expression? [b]:tok_semicolon [iterat
ion]:expression?
| kw_for tok_lpar declaration [c
ondition]:expression? tok_semicolon [iteration]:expression? tok_rpar statement
;
jump_statement = kw_goto identifier tok_semicolon
| kw_continue tok_semicolon
| kw_break tok_semicolon
| kw_return expression? tok_semicolon
;

You might also like