Он основан на этой статье , но использует lex
вместо того, чтобы самому его реализовать.
Но я пробовал различные выражения, например 2+3
, все не удалось ...
lex:
0 {
yylval = atoi(yytext);
}
[1-9][0-9]* {
yylval = atoi(yytext);
return NUM;
}
[-+*/()] {
return *yytext;
}
[ \t\n]+ ;
. yyerror("Unknown character");
yacc:
%start prob
%token NUM
%%
prob : expr '\n'
{
printf("\t=%X\n", $1);
return 0;
}
;
expr : expr '+' term
{
$$ = $1 + $3;
}
| expr '-' term
{
$$ = $1 - $3;
}
| term
{
$$ = $1;
}
;
term : term '*' NUM
{
$$ = $1 * $3;
}
| term '/' NUM
{
$$ = $1/$3;
}
| '(' expr ')'
{
$$ = $2;
}
| NUM
{
$$ = $1;
}
;
%%