====== C3 - tutorial/cecko3.g ====
Gramatika zjednodušeného C++ používaná v kapitole "Objektově orientované syntaktické stromy"
[[http://gitlab.fjfi.cvut.cz/culikzde/simple-view/-/blob/master/tutorial/cecko3.g|cecko3.g]]
Abychom odlišili lokální deklaraci od jednoduchého příkazu obsahujícího výraz a středník, \\
musíme si jazyk upravit a před deklaraci přidat klíčové slovo **dcl**.
decl_stat < CmmDeclStat: CmmStat >:
"dcl" inner_decl:simple_decl ;
simple_stat < CmmSimpleStat: CmmStat >:
inner_expr:expr
';' ;
stat < select CmmStat > :
decl_stat |
while_stat |
if_stat |
for_stat |
return_stat |
compound_stat |
simple_stat |
empty_stat ;
Gramatika je již poměrně dlouhá:
/* statements */
while_stat < CmmWhileStat: CmmStat > :
"while"
'(' cond:expr ')'
body_stat:inner_stat ;
if_stat < CmmIfStat: CmmStat > :
"if"
'(' cond:expr ')'
then_stat:inner_stat
(
"else"
else_stat:inner_stat
)? ;
for_stat :
"for"
'('
( from_expr:expr )?
';'
( cond_expr:expr )?
';'
( step_expr:expr) ?
')'
body_stat:inner_stat ;
return_stat :
"return"
( return_expr:expr )?
';' ;
compound_stat < CmmCompoundStat: CmmStat > :
'{'
( stat )*
'}' ;
simple_stat < CmmSimpleStat: CmmStat >:
inner_expr:expr
';' ;
decl_stat < CmmDeclStat: CmmStat >:
"dcl" inner_decl:simple_decl ;
empty_stat < CmmEmptyStat: CmmStat > :
';' ;
stat < select CmmStat > :
decl_stat |
while_stat |
if_stat |
for_stat |
return_stat |
compound_stat |
simple_stat |
empty_stat ;
inner_stat < return CmmStat > :
stat
;
/* -------------------------------------------------------------------- */
/* expressions */
< struct CmmExpr { enum kind; } >
< struct CmmPostfixExpr : CmmExpr { CmmExpr left; } >
< struct CmmBinaryExpr : CmmExpr { } >
< group expr * CmmExpr >
variable_expr :
name:identifier
;
int_value_expr :
value:number;
real_value_expr :
value:real_number;
char_value_expr :
value:character_literal;
string_value_expr :
value:string_literal;
subexpr_expr :
'(' inner_expr:expr ')' ;
sequence_expr :
'[' param:expr_list ']' ;
this_expr :
"this";
simple_expr