2

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プログラム: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

これを解決するのを手伝ってください。前もって感謝します。

4

1 に答える 1

1

yyerror次のように、独自のものを提供する必要があります。

void yyerror (char *s) {
    fprintf (stderr, "%s\n", s);
}

ソース:

http://lists.gnu.org/archive/html/help-bison/2012-01/msg00016.html

于 2012-10-25T17:21:37.847 に答える