See Bison source file parser.y for actions.
primary_expression
: LEX_NULL
| LEX_TRUE
| LEX_FALSE
| LEX_INT
| LEX_IDENTIFIER
| LEX_FLOAT
| LEX_STRING
| '(' expression ')'
;
postfix_expression
: primary_expression
| postfix_expression '[' expression ']'
| LEX_IDENTIFIER '(' ')'
| LEX_IDENTIFIER '(' argument_expression_list ')'
| postfix_expression '.' LEX_IDENTIFIER
| postfix_expression '.' LEX_IDENTIFIER '(' ')'
| postfix_expression '.' LEX_IDENTIFIER '(' argument_expression_list ')'
| postfix_expression LEX_INC_OP
| postfix_expression LEX_DEC_OP
;
argument_expression_list
: assignment_expression
| argument_expression_list ',' assignment_expression
;
unary_expression
: postfix_expression
| LEX_INC_OP unary_expression
| LEX_DEC_OP unary_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
;
multiplicative_expression
: unary_expression
| multiplicative_expression '*' unary_expression
| multiplicative_expression '/' unary_expression
| multiplicative_expression '%' unary_expression
;
additive_expression
: multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
relational_expression
: additive_expression
| relational_expression '<' additive_expression
| relational_expression '>' additive_expression
| relational_expression LEX_LE_OP additive_expression
| relational_expression LEX_GE_OP additive_expression
;
equality_expression
: relational_expression
| equality_expression LEX_EQ_OP relational_expression
| equality_expression LEX_NE_OP relational_expression
;
logical_and_expression
: equality_expression
| logical_and_expression LEX_AND_OP equality_expression
;
logical_or_expression
: logical_and_expression
| logical_or_expression LEX_OR_OP logical_and_expression
;
conditional_expression
: logical_or_expression
| logical_or_expression '?' expression ':' conditional_expression
;
assignment_expression
: conditional_expression
| unary_expression '=' assignment_expression
| unary_expression LEX_MUL_ASSIGN assignment_expression
| unary_expression LEX_DIV_ASSIGN assignment_expression
| unary_expression LEX_MOD_ASSIGN assignment_expression
| unary_expression LEX_ADD_ASSIGN assignment_expression
| unary_expression LEX_SUB_ASSIGN assignment_expression
| unary_expression LEX_REF_ASSIGN assignment_expression
;
expression
: assignment_expression
;
statement
: compound_statement
| expression_statement
/* "parser.y: conflicts: 1 shift/reduce" is ok */
| LEX_IF '(' expression ')' statement
| LEX_IF '(' expression ')' statement LEX_ELSE statement
| LEX_WHILE '(' expression ')' statement
| LEX_FOR '(' expression_statement expression_statement ')' statement
| LEX_FOR '(' expression_statement expression_statement expression ')' statement
| LEX_FOREACH '(' LEX_IDENTIFIER ';' expression ')' statement
| LEX_BREAK ';'
| LEX_CONTINUE ';'
| LEX_RETURN ';'
| LEX_RETURN expression ';'
| LEX_GLOBAL LEX_IDENTIFIER ';'
;
expression_statement
: ';'
| expression ';'
;
compound_statement
: '{' '}'
| '{' block_item_list '}'
;
block_item_list
: statement
| block_item_list statement
;
function_definition
: function_and_name '(' parameter_list ')' compound_statement
| function_and_name '(' ')' compound_statement
;
function_and_name
: LEX_FUNCTION LEX_IDENTIFIER
;
parameter_list
: LEX_IDENTIFIER
| parameter_list ',' LEX_IDENTIFIER
;
start
: /* empty */
| start function_definition
;