Я использую следующую грамматику для представления сложения, умножения чисел
Stmts->epsilon|Stmt
E->Integer|Id|E*E|E+E
Integer -> digit+
Выражение может быть уменьшено до выражения или числа или числа * Число или число + число
Целое число может принимать одно или более цифр
Id может быть переменной, которая должна начинаться со строчной буквы, за которой следует любое количество строчных букв или цифр
Но я также хочу представить
Stmt -> Id = E | Id*=E | Id+=E |print E
Следующая грамматика
stmt:
| stmt expr_stmt
;
expr_stmt:
expr TOK_SEMICOLON
| TOK_PRINTLN expr TOK_SEMICOLON
{
fprintf(stdout, "the value is %d\n", $2);
}
|expr
;
expr:
expr TOK_ADD expr
{
$$ = $1 + $3;
}
| expr TOK_SUB expr
{
$$ = $1 - $3;
}
| expr TOK_MUL expr
{
$$ = $1 * $3;
}
| expr TOK_DIV expr
{
if($3 == 0)
yyerror("divide by zero");
else
$$ = $1 / $3;
}
| TOK_NUM
{
$$ = $1;
}
| TOK_ID
| TOK_MUL TOK_EQ expr
| TOK_ADD TOK_EQ expr
;
Показывает конфликты сдвига / уменьшения.