Я безуспешно пытался преобразовать инфиксное выражение в постфиксное выражение, используя YACC (Bison). Я хотел бы знать, как это можно сделать? Пример кода будет потрясающим :)
Преобразование инфикса в постфикс в YACC (Bison)
comment
Возможно, вы могли бы опубликовать свои попытки и объяснить, как и где это не удалось, вместо того, чтобы просто спрашивать код?
- person Bart Kiers   schedule 06.01.2012
comment
Я понятия не имею, как это сделать, и Google не очень помог!
- person Vipin Parakkat   schedule 06.01.2012
comment
Не знаете, как преобразовать in- в постфикс? Не знаете, как использовать yacc/bison? Что-то другое? Я не могу себе представить, что на первые два вопроса нельзя легко ответить с помощью веб-поиска. Ваш вопрос как таковой является просто призывом к кому-то другому сделать вашу (домашнюю) работу, и поэтому мой опыт вряд ли даст ответ. Здесь также не помешает немного контекста: почему вы хотите использовать здесь генератор парсеров? Это перебор.
- person Bart Kiers   schedule 06.01.2012
comment
возможно, это поможет
- person Anubhav Agarwal   schedule 19.04.2012
Ответы (1)
Это мое решение:
файл gram.l:
%{
#include"y.tab.h"
extern int yylval;
%}
%%
[0-9]+ {yylval=atoi(yytext); return NUM;}
\n return 0;
. return *yytext;
%%
int yywrap(){
return 1;
}
файл gram.y:
%{
#include<stdio.h>
%}
%token NUM
%left '+' '-'
%left '*' '/'
%right NEGATIVE
%%
S: E {printf("\n");}
;
E: E '+' E {printf("+");}
| E '*' E {printf("*");}
| E '-' E {printf("-");}
| E '/' E {printf("/");}
| '(' E ')'
| '-' E %prec NEGATIVE {printf("-");}
| NUM {printf("%d", yylval);}
;
%%
int main(){
yyparse();
}
int yyerror (char *msg) {
return printf ("error YACC: %s\n", msg);
}
оболочка:
yacc -d gram.y
flex gram.l
cc lex.yy.c y.tab.c
./a.out
пример ввода и вывода:
2+6*2-5/3
262*+53/-
person
george
schedule
25.11.2012