LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2068|回复: 4

求助:在linux下使用记法分析器flex和语法分析器bison遇到的问题

[复制链接]
发表于 2006-1-6 11:49:14 | 显示全部楼层 |阅读模式
我用的系统是Redhat9.0。
因为在学习使用linux下的flex和bison,我按照《lex和yacc》这本书上的一个例子操作。但是一直存在问题。
这个例子是一个简单计算器。包括一个.l的lex程序和一个.y的yacc程序。
具体如下 :
Ch301.l
%{
#include "ch301.tab.h"
extern int yylval;
%}
                                                                                
                                                                                
%%
[0-9]+          {yylval=atoi(yytext);return NUMBER;}
[ /t] ;
\n              return 0;
.               return yytext[0];
%%

ch301.y
%token NAME NUMBER
%%
statement:NAME '=' expression
        |       expression      {printf("=%d\n",$1);}
        ;
                                                                                
expression: expression '+' NUMBER { $$ = $1 + $3; }
        |       expression '-' NUMBER { $$ = $1 - $3; }
        |       NUMBER          { $$ = $1;}
        ;


按下面的命令执行,结果如下:                                                                             
[root@wy ch301]# ls
ch301.l  ch301.y
[root@wy ch301]# flex ch301.l
[root@wy ch301]# ls
ch301.l  ch301.y  lex.yy.c
[root@wy ch301]# bison -d ch301.y
[root@wy ch301]# ls
ch301.l  ch301.tab.c  ch301.tab.h  ch301.y  lex.yy.c
[root@wy ch301]# cc -c lex.yy.c ch301.tab.c
[root@wy ch301]# ls
ch301.l  ch301.tab.c  ch301.tab.h  ch301.tab.o  ch301.y  lex.yy.c  lex.yy.o
[root@wy ch301]# cc -o ch301 ch301.tab.o lex.yy.o -ll
ch301.tab.o(.text+0x542): In function `yyparse':
: undefined reference to `yyerror'
ch301.tab.o(.text+0x67d): In function `yyparse':
: undefined reference to `yyerror'
collect2: ld returned 1 exit status


这是《lex与yacc》这本书上的例子,为什么就不能通过呢?
那报的这种错误应该如何解决呢?

恳请高手帮忙!
万分感谢!
发表于 2006-1-6 12:47:42 | 显示全部楼层
自己写个空的yyerror应该就可以了
回复 支持 反对

使用道具 举报

发表于 2006-1-6 17:05:39 | 显示全部楼层
加入:

  1. int yyerror (char *err) {
  2.      fprintf(stderr, "%s", err);
  3. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-9 18:20:56 | 显示全部楼层
谢谢两位的帮助,我已经按 gnap 的建议在ch301.y程序中加入了这段代码,并在开头处加入
%{
#include<stdio.h>
%}
编译和连接都已经通过。生成可执行文件ch301,在终端中输入命令 ./ch301后,好象是处于程序运行中,但是当我输入数据,如99+2,程序并不能运行,回车后就又回到了终端的命令状态。
晕了,不知道是咋个回事儿。可能是源代码自身的问题吧。
谢谢各位哈。
回复 支持 反对

使用道具 举报

发表于 2006-8-23 16:51:15 | 显示全部楼层

ch3-01.y改成这样就可以用了

%{
#include <stdio.h>
%}

%token NAME NUMBER
%%
statement:        NAME '=' expression
        |        expression                { printf("= %d\n", $1); }
        ;

expression:        expression '+' NUMBER        { $$ = $1 + $3; }
        |        expression '-' NUMBER        { $$ = $1 - $3; }
        |        NUMBER                        { $$ = $1; }
        ;
%%

extern FILE *yyin;

main()
{
        //while(!feof(yyin)) {
                yyparse();
        //}
}

yyerror(s)
char *s;
{
    fprintf(stderr, "%s\n", s);
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表