====== C-- ======
===== Sémantické predikáty =====
{ function_name }? grammar_expression
flexible_stat :
expr
(
{ is_expression }? simple_stat
|
{ is_expression }? block_stat
|
continue_simple_declaration
) ;
simple_stat :
';'
;
block_stat :
body:compound_stat
;
def parse_flexible_stat (self) :
self.on_begin_flexible_expr ()
result = self.parse_expr ()
self.on_end_flexible_expr ()
if self.tokenText == ";" and self.is_expression (result) :
result = self.parse_simple_stat (result)
elif self.tokenText == "{" and self.is_expression (result) :
result = self.parse_block_stat (result)
elif self.set_8 [self.token] :
result = self.parse_continue_simple_declaration (result)
else :
self.error ("Unexpected token")
return result
===== Gramatika C-- =====
[[http://gitlab.fjfi.cvut.cz/culikzde/view/-/blob/master/cmm/cmm.g|cmm.g]]
/* cmm.g */
/* --------------------------------------------------------------------- */
< struct CmmExpr { enum kind;
bool type_flag;
bool remember_enable_declaration;
ptr item_decl;
ptr item_type;
str alt_assign;
str alt_connect;
ptr alt_connect_dcl;
str alt_connect_signal;
} >
< struct CmmName : CmmExpr { } >
< struct CmmBinaryExpr : CmmExpr { } >
< struct CmmCondition { enum kind; } >
< struct CmmDeclarationCondition : CmmCondition {
ptr decl_spec;
bool a_destructor;
} >
< struct CmmStat { enum mode; } >
< struct CmmDecl : CmmStat { } >
< struct CmmDeclarator { enum kind; } >
< struct CmmPtrSpecifier { enum kind; } >
< struct CmmContSpecifier { enum kind; } >
< struct CmmParam { enum kind; } >
< struct CmmTextStat : CmmStat, mode = textStat { str text; } >
< struct CmmEolStat : CmmStat, mode = eolStat >
< struct CmmIndentStat : CmmStat, mode = indentStat >
< struct CmmUnindentStat : CmmStat, mode = unindentStat >
< struct CmmEmptyLineStat : CmmStat, mode = emptyLineStat >
< struct CmmCppOnlyStat : CmmStat, mode = cppOnlyStat { ptr inner_stat; } >
< struct CmmPythonOnlyStat : CmmStat, mode = pythonOnlyStat { ptr inner_stat; } >
< group expr * CmmExpr >
< group stat % CmmStat
: stat, flexible_stat, declaration, member_item
/ nested_stat, continue_simple_declaration >
< group param * CmmParam >
< artificial stat, text_stat, CmmTextStat >
< artificial stat, eol_stat, CmmEolStat >
< artificial stat, indent_stat, CmmIndentStat >
< artificial stat, unindent_stat, CmmUnindentStat >
< artificial stat, empty_line_stat, CmmEmptyLineStat >
< artificial stat, cpp_only_stat, CmmCppOnlyStat >
< artificial stat, python_only_stat, CmmPythonOnlyStat >
< execute_on_entry_no_param
on_begin_flexible_expr :
flexible_stat,
parameter_declaration,
condition,
template_arg >
< execute_on_fork_no_param
on_end_flexible_expr :
flexible_stat,
parameter_declaration,
condition,
template_arg >
< execute_on_choose
on_binary_expr :
// postfix_expr,
pm_expr,
multiplicative_expr,
additive_expr,
shift_expr,
relational_expr,
equality_expr,
and_expr,
exclusive_or_expr,
inclusive_or_expr,
logical_and_expr,
logical_or_expr,
assignment_expr,
colon_expr,
comma_expr >
< predicate_on_choose
is_binary_expression :
// postfix_expr,
pm_expr,
// multiplicative_expr,
additive_expr,
shift_expr,
relational_expr,
equality_expr,
// and_expr,
exclusive_or_expr,
inclusive_or_expr,
logical_and_expr,
logical_or_expr,
assignment_expr,
colon_expr,
comma_expr >
< predicate_on_choose
is_postfix_expression :
postfix_expr >
< predicate_on_choose
is_multiplicative_expression :
multiplicative_expr >
< predicate_on_choose
is_and_expression :
and_expr >
< execute_on_end on_ident_expr : ident_expr >
< execute_on_end on_int_value : int_value >
< execute_on_end on_real_value : real_value >
< execute_on_end on_char_value : char_value >
< execute_on_end on_string_value : string_value >
< execute_on_end on_this_expr : this_expr >
< execute_on_end on_subexpr_expr : subexpr_expr >
< execute_on_end on_field_expr : field_expr >
< execute_on_end on_ptr_field_expr : ptr_field_expr >
< execute_on_end on_call_expr : call_expr >
< execute_on_end on_type_specifier : type_specifier >
< execute_on_end on_type_name : type_name >
< execute_on_end on_cv_specifier : const_specifier, volatile_specifier >
< execute_on_end on_bit_not_expr : bit_not_expr >
< execute_on_end
on_name_expr :
base_variant >
< execute_on_begin_no_param
on_other_expr :
int_value,
real_value,
char_value,
string_value,
this_expr,
subexpr_expr,
modern_cast_expr,
typeid_expr,
type_name,
type_specifier,
const_specifier,
volatile_specifier,
inc_expr,
dec_expr,
deref_expr,
addr_expr,
plus_expr,
minus_expr,
bit_not_expr,
log_not_expr,
sizeof_expr,
allocation_expr,
deallocation_expr,
throw_expr,
cast_formula >
/*
identifier
number
real_number
character_literal
string_literal
*/
/* --------------------------------------------------------------------- */
/* simple name */
simple_name :
id:identifier ; // only identifier
/* base name */
global_variant