在lex程序

时间:2017-04-29 06:16:11

标签: compiler-construction flex-lexer lex

我正在研究Lex和Yacc程序,但我收到的错误是:

  

/tmp/ccTP9YY1.o:在函数yylex': lex.yy.c:(.text+0x289): undefined reference to yylval'中   lex.yy.c :(。text + 0x2a8):对`yylval'的未定义引用   collect2:错误:ld返回1退出状态

我在互联网上搜索了很多像stackoverflow和其他网站,但似乎没有一个能够解决我的问题。我可能错误地实施了这些建议。任何人都可以建议我这个吗? 提前谢谢。

%{
#include <stdlib.h>
#include "y.tab.h"
void yyerror(char *); 
%}
%%
[a-z]  {
      yylval = *yytext - 'a';
      return VARIABLE;
       }
[0-9]+ {
      yylval = atoi(yytext);
      return INTEGER;
   }
[-+()=/*\n] { return *yytext; }
[ \t]        ;
.  {  yyerror("invalid character");   }

%%

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

int yywrap(void) {
   return 1;
}

使用的命令:

rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ lex echo.l
rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ yacc -d yaccCalc.y 
rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ gcc lex.yy.c y.tab.h -ll
/tmp/ccTP9YY1.o: In function `yylex':
lex.yy.c:(.text+0x289): undefined reference to `yylval'
lex.yy.c:(.text+0x2a8): undefined reference to `yylval'
collect2: error: ld returned 1 exit status

Yacc文件:

%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'

%{
   void yyerror(char *);
   int yylex(void);
   int sym[26];
%}

%%

program:
    program statement '\n'
    | 
    ;

statement:
    expr                      { printf("%d\n", $1); }
    | VARIABLE '=' expr       { sym[$1] = $3; }
    ;

expr:
    INTEGER
    | VARIABLE                { $$ = sym[$1]; }
    | expr '+' expr           { $$ = $1 + $3; }
    | expr '-' expr           { $$ = $1 - $3; }
    | expr '*' expr           { $$ = $1 * $3; }
    | expr '/' expr           { $$ = $1 / $3; }
    | '(' expr ')'            { $$ = $2; }
    ;

%%

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

int main(void) {
   yyparse();
   return 0;
}

2 个答案:

答案 0 :(得分:1)

您应该编译.c文件,而不是.h文件。下面是编译lex和yacc程序所需的命令:

1. yacc -d yaccCalc.y
2. lex echo.l
3. cc lex.yy.c y.tab.c -ll -ly

答案 1 :(得分:0)

Yacc(和Bison)生成两个文件,即y.tab.hy.tab.c,假设您没有使用选项-o覆盖输出文件。在源代码中包含y.tab.h并编译y.tab.c。所以也许你在编译时弄错了:

gcc lex.yy.c y.tab.c -ll
-------------------^-------- compile y.tab.c, not y.tab.h