📄 yacc.y
字号:
{$$=$1;}
| declaration
{
$$=local_define($1->spec, $1->declist);//return init exp statement
}
;
labeled_statement
: IDENTIFIER ':' statement
{
if($3->labelno == UNKNOWN)
$3->labelno = newlabelno++;
add_named_label($1.s,$3->labelno);
$$=$3;
}
| CASE assignment_expression ':' statement
{
if($4->labelno ==UNKNOWN)
$4->labelno = newlabelno++;
$$ = newCalcStmt(stmt_case, $2, $4, NULL, NULL, currentfile, lineno);
$$ ->labelno = $4->labelno;
}
| DEFAULT ':' statement
{
if($3->labelno ==UNKNOWN)
$3->labelno = newlabelno++;
$$ = newCalcStmt(stmt_default, NULL, $3, NULL, NULL, currentfile, lineno);
$$ ->labelno = $3->labelno;
}
;
compound_statement
: '{' '}'
{
$$ = newCalcStmt(stmt_compound, NULL, NULL, NULL, NULL, currentfile, lineno);
}
| '{'
{
if(blocklevel++)
enter_block();
}
statement_list '}'
{
$$ = newCalcStmt(stmt_compound, NULL, $3, NULL, NULL, currentfile, lineno);
if(--blocklevel)
leave_block();
}
;
statement_list
: statement
{$$=$1;}
| statement_list statement
{
appendObject(&$1, $2);
$$ = $1;
}
;
expression_statement
: null_expression ';'
{
$$ = newCalcStmt(stmt_exp, $1, NULL, NULL, NULL, currentfile, lineno);
}
;
selection_statement
: IF '(' expression ')' statement
{
$$ = newCalcStmt(stmt_if, $3, NULL, $5, NULL, currentfile, lineno);
}
| IF '(' expression ')' statement ELSE statement
{
$$ = newCalcStmt(stmt_if, $3, NULL, $5, $7, currentfile, lineno);
}
| SWITCH '(' expression ')' statement
{
$$ = newCalcStmt(stmt_switch, $3, $5, NULL, NULL, currentfile, lineno);
}
;
iteration_statement
: WHILE '(' expression ')' statement
{
$$ = newCalcStmt(stmt_while, $3, $5, NULL, NULL, currentfile, lineno);
}
| DO statement WHILE '(' expression ')' ';'
{
$$ = newCalcStmt(stmt_do, $5, $2, NULL, NULL, currentfile, lineno);
}
| FOR '(' expression_statement null_expression ';' null_expression ')' statement
{
$$ = newCalcStmt(stmt_for, $4, $8, $3,
newCalcStmt(stmt_exp, $6, NULL, NULL, NULL, currentfile, lineno),
currentfile, lineno);
}
| FOR '(' declaration
{
int tmp=blocklevel;
enter_block();
blocklevel=0;//do like aguments
$<stmt>$=local_define($3->spec, $3->declist);//return init exp statement
$<stmt>$->lineno = tmp;
}
null_expression ';' null_expression ')' statement
{
//need to record the defined symbols
$$ = newCalcStmt(stmt_for, $5, $9, $<stmt>4,
newCalcStmt(stmt_exp, $7, NULL, NULL, NULL, currentfile, lineno),
currentfile, lineno);
leave_block();
blocklevel=$<stmt>4->lineno;
}
;
jump_statement
: GOTO IDENTIFIER ';'
{
ExpNode *aexp = evaluate_label_exp($2.s);
$$ = newCalcStmt(stmt_goto, aexp, NULL, NULL, NULL, currentfile, lineno);
}
| CONTINUE ';'
{
$$ = newCalcStmt(stmt_continue, NULL, NULL, NULL, NULL, currentfile, lineno);
}
| BREAK ';'
{
$$ = newCalcStmt(stmt_break, NULL, NULL, NULL, NULL, currentfile, lineno);
}
| RETURN null_expression ';'
{
$$ = newCalcStmt(stmt_return, $2, NULL, NULL, NULL, currentfile, lineno);
}
;
expression
: assignment_expression
{
$$=$1;
}
| expression ',' assignment_expression
{
appendObject(&$1, $3);
$$ = $1;
}
;
null_expression
:
{$$ = evaluate_void_exp();}
| expression
{$$ = $1;}
;
primary_expression
: IDENTIFIER
{
$$ = evaluate_id_exp($1.s);
}
| CINT
{
$$ = evaluate_const_exp(bt_long, &($1.i));
}
| CUINT
{
$$ = evaluate_const_exp(bt_unsignedlong, &($1.u));
}
| STRING
{
$$ = evaluate_const_exp(bt_pointer, $1.s); //remember allocate mem for const string
}
| CFLOAT
{
$$ = evaluate_const_exp(bt_double, &($1.f));
}
| CBOOL
{
$$ = evaluate_const_exp(bt_long, &($1.i));
}
| '(' expression ')'
{$$=$2;}
;
postfix_expression
: primary_expression
{$$=$1;}
| postfix_expression '[' expression ']'
{
$$ = evaluate_array_exp($1, $3);
}
| postfix_expression '(' ')'
{
$$ = evaluate_call_exp($1, evaluate_void_exp());
}
| postfix_expression '(' expression ')'
{
$$ = evaluate_call_exp($1, $3);
}
| postfix_expression NTOMEM IDENTIFIER
{
$$ = evaluate_member_exp(exp_ntomem, $1, $3.s);
}
| postfix_expression PTOMEM IDENTIFIER
{
$$ = evaluate_member_exp(exp_ptomem, $1, $3.s);
}
| postfix_expression INCR
{
$$ = evaluate_indecr_exp(-exp_incr, $1);
}
| postfix_expression DECR
{
$$ = evaluate_indecr_exp(-exp_decr, $1);
}
;
unary_expression
: postfix_expression
{
$$=$1;
}
| INCR unary_expression
{
$$ = evaluate_indecr_exp(exp_incr, $2);
}
| DECR unary_expression
{
$$ = evaluate_indecr_exp(exp_decr, $2);
}
| unary_operator unary_expression
{
$$ = evaluate_unary_exp($1.i, $2);
}
| '(' abstract_type_specifier ')' unary_expression
{
$$ = evaluate_typecast_exp($2, $4);
}
| SIZEOF '(' unary_expression ')'
{
$$ = evaluate_sizeof_exp(NULL, $3);
}
| SIZEOF '(' abstract_type_specifier ')'
{
$$ = evaluate_sizeof_exp($3, NULL);
}
;
unary_operator
: '&'
{$$.i = exp_ptr;}
| '*'
{$$.i = exp_val;}
| '+'
{$$.i = exp_uplus;}
| '-'
{$$.i = exp_uminus;}
| '~'
{$$.i = exp_rvs;}
| '!'
{$$.i = exp_lnot;}
;
multiplicative_expression
: unary_expression
{$$=$1;}
| multiplicative_expression '*' unary_expression
{
$$ = evaluate_binary_exp(exp_mul, $1, $3);
}
| multiplicative_expression '/' unary_expression
{
$$ = evaluate_binary_exp(exp_div, $1, $3);
}
| multiplicative_expression '%' unary_expression
{
$$ = evaluate_binary_exp(exp_mod, $1, $3);
}
;
additive_expression
: multiplicative_expression
{$$ =$1;}
| additive_expression '+' multiplicative_expression
{
$$ = evaluate_binary_exp(exp_add, $1, $3);
}
| additive_expression '-' multiplicative_expression
{
$$ = evaluate_binary_exp(exp_sub, $1, $3);
}
;
shift_expression
: additive_expression
{$$ =$1;}
| shift_expression LSH additive_expression
{
$$ = evaluate_binary_exp(exp_lsh, $1, $3);
}
| shift_expression RSH additive_expression
{
$$ = evaluate_binary_exp(exp_rsh, $1, $3);
}
;
relational_expression
: shift_expression
{$$ =$1;}
| relational_expression LES shift_expression
{
$$ = evaluate_cmp_exp(exp_les, $1, $3);
}
| relational_expression GTR shift_expression
{
$$ = evaluate_cmp_exp(exp_gtr, $1, $3);
}
| relational_expression LEQ shift_expression
{
$$ = evaluate_cmp_exp(exp_leq, $1, $3);
}
| relational_expression GEQ shift_expression
{
$$ = evaluate_cmp_exp(exp_geq, $1, $3);
}
;
equality_expression
: relational_expression
{$$ = $1;}
| equality_expression EQ relational_expression
{
$$ = evaluate_cmp_exp(exp_eq, $1, $3);
}
| equality_expression UEQ relational_expression
{
$$ = evaluate_cmp_exp(exp_ueq, $1, $3);
}
;
and_expression
: equality_expression
{$$=$1;}
| and_expression '&' equality_expression
{
$$ = evaluate_bit_exp(exp_and, $1, $3);
}
;
exclusive_or_expression
: and_expression
{$$=$1;}
| exclusive_or_expression '^' and_expression
{
$$ = evaluate_bit_exp(exp_xor, $1, $3);
}
;
inclusive_or_expression
: exclusive_or_expression
{$$=$1;}
| inclusive_or_expression '|' exclusive_or_expression
{
$$ = evaluate_bit_exp(exp_or, $1, $3);
}
;
logical_and_expression
: inclusive_or_expression
{$$=$1;}
| logical_and_expression LAND inclusive_or_expression
{
$$ = evaluate_logic_exp(exp_land, $1, $3);
}
;
logical_or_expression
: logical_and_expression
{$$=$1;}
| logical_or_expression LOR logical_and_expression
{
$$ = evaluate_logic_exp(exp_lor, $1, $3);
}
;
conditional_expression
: logical_or_expression
{$$=$1;}
| logical_or_expression '?' expression ':' conditional_expression
{
$$ = evaluate_trinary_exp($1, $3, $5);
}
;
assignment_expression
: conditional_expression
{$$=$1;}
| unary_expression assignment_operator assignment_expression
{
$$ = evaluate_assign_exp($2.i, $1, $3);
}
;
assignment_operator
: ASSIGN
{$$.i = exp_assign;}
| MULAS
{$$.i = exp_mulas;}
| DIVAS
{$$.i = exp_divas;}
| MODAS
{$$.i = exp_modas;}
| ADDAS
{$$.i = exp_addas;}
| SUBAS
{$$.i = exp_subas;}
| LSHAS
{$$.i = exp_lshas;}
| RSHAS
{$$.i = exp_rshas;}
| ANDAS
{$$.i = exp_andas;}
| XORAS
{$$.i = exp_xoras;}
| ORAS
{$$.i = exp_oras;}
;
%%
void yyerror(char *info)
{
generror(ERR_SYNTAX_ERROR, info);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -