我正在尝试使用lex和yacc工具开发一个将中缀表达式转换为后缀表达式的程序。
以下是源代码:
(Lex计划:ipi.l)
ALPHA [A-Z a-z]
DIGIT [0-9]
%%
{ALPHA}({ALPHA}|{DIGIT})* return ID;
{DIGIT}+ {yylval=atoi(yytext); return ID;}
[\n \t] yyterminate();
. return yytext[0];
%%
(Yacc program:ipi.y)
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token ID
%left '+' '-'
%left '*' '/'
%left UMINUS
%%
S : E
E : E'+'{A1();}T{A2();}
| E'-'{A1();}T{A2();}
| T
;
T : T'*'{A1();}F{A2();}
| T'/'{A1();}F{A2();}
| F
;
F : '('E{A2();}')'
| '-'{A1();}F{A2();}
| ID{A3();}
;
%%
#include "lex.yy.c"
char st[100];
int top=0;
main()
{
printf("Enter infix expression: ");
yyparse();
printf("\n");
}
A1()
{
st[top++]=yytext[0];
}
A2()
{
printf("%c",st[--top]);
}
A3()
{
printf("%c",yytext[0]);
}
但是它出现以下错误:
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/liby.a(yyerror.o): In function `yyerror':
(.text+0x1c): undefined reference to `rpl_fprintf'
collect2: ld returned 1 exit status
请帮我解决这个问题。 提前谢谢。
答案 0 :(得分:1)
您应该提供自己的yyerror
,如下所示:
void yyerror (char *s) {
fprintf (stderr, "%s\n", s);
}
来源:
http://lists.gnu.org/archive/html/help-bison/2012-01/msg00016.html