Я новичок в программах lex и yacc. Я пытаюсь написать программу yacc, которая принимает в качестве входного выражения арифметическое выражение и дает постфиксную нотацию в качестве вывода. Грамматика, которую я использую: exp: exp + термин | exp - term | термин термин: термин * фактор | термин/коэффициент | фактор фактора: Numyacc программа для преобразования арифметического выражения в постфикс
Это мой закон Код:
%{
extern int yylval;
#include "y.tab.h"
%}
%%
[0-9]+ {yylval = atoi(yytext);return INTEGER;}
[ \t\n] /* skip whitespace */
. {return *yytext;}
%%
int yywrap(void) {
return 1;
}
Это моя Yacc программа:
%{
#include<stdio.h>
%}
%token INTEGER
%left '+' '-'
%left '*' '/'
%%
E: E '+' T {printf("+");}
| E '-' T {printf("-");}
| T
;
T: T '*' F {printf("*");}
| T '/' F {printf("/");}
| F
;
F: '(' E ')'
| INTEGER {printf("%d",yylval);}
;
%%
int main(){
yyparse();
}
int yyerror (char *msg) {
return printf ("error YACC: %s\n", msg);
}
Но этот код компиляция correctly.But вывода не является правильным, если «+ 'или' - 'используются в выражении Например, вход: 2 + 3 вывод: 23 (вместо 23+) Пожалуйста, помогите мне узнать об ошибке в коде. Спасибо.
Ваша грамматика принимает только одно выражение. Если вы закрываете ввод после выражения, он будет печатать правильно. – rici
Также обратите внимание, что вам не нужен T-терминал, потому что вы указываете то же самое с использованием приоритета оператора. – user3344003