Преобразование инфикса в постфикс в YACC (Bison)

Я безуспешно пытался преобразовать инфиксное выражение в постфиксное выражение, используя YACC (Bison). Я хотел бы знать, как это можно сделать? Пример кода будет потрясающим :)


person Vipin Parakkat    schedule 06.01.2012    source источник
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