2 fengwufeiyang01 fengwufeiyang01 于 2013.12.21 15:15 提问

ubuntu下bison编写语法分析器的问题

用flex和bison编写语法分析器,但是有一行提示语法错误,涉及到“REALNUM”和“INTEGER”的产生式都会报错,求解答。
测试内容为:
main()
{
int a;
double b;
a=true;
a=false;
}
此时能通过,但是测试内容为
main()
{
int a;
double b;
a=1;
b=1.4;
}
就会报第5行第6行语法错误。求解。
相关代码如下:
flex.l中:
IDENTIFIER[a-zA-Z_$][a-zA-Z0-9_$]*
INTEGER ^-?[0-9]+$
REALNUM ^(-?[0-9]+)(.[0-9]+)?$
…………
{IDENTIFIER} {ids++; yylval.id=(char*)strdup(yytext);
return IDENTIFIER;}
{INTEGER} {ints++; yylval.interval = atoi(yytext);
return INTEGER;}
{REALNUM} {reals++;yylval.realval = atof(yytext);
return REALNUM;}
{WHITESPACE} {}
{NEWLINE} {lineno++;}
syntax.y中
program:
MAIN '(' ')' SBLOCK {printf("(%d)\t program ->MAIN() SBLOCK\n",linenum++);}
;

SBLOCK:
'{' DECLS STMTS '}' {printf("(%d)\t SBLOCK -> { DECLS STMTS }\n",linenum++);}
;

DECLS:
DECLS DECL {printf("(%d)\tDECLS -> DECLS DECL\n",linenum++);}
| {printf("(%d)\tDECLS -> e\n",linenum++);}
;

DECL:
INT IDENTIFIER ';' {printf("(%d)\tDECL -> INT %s\n",linenum++,$2);}
|REAL IDENTIFIER ';' {printf("(%d)\tDECL -> REAL %s\n",linenum++,$2);}
;

STMTS:
STMTS STMT {printf("(%d)\tSTMTS -> STMTS STMT\n",linenum++);}
| {printf("(%d)\tSTMTS -> e\n",linenum++);}
;

STMT:
IDENTIFIER ASSGNOP BEXP ';' {printf("(%d)\t STMT -> %s = BEXP\n",linenum++,$1);}
|IF '(' BEXP ')' STMT %prec IF_THEN {printf("(%d)\t STMT -> IF ( BEXP ) STMT\n",linenum++);}
|IF '(' BEXP ')' STMT ELSE STMT {printf("(%d)\t STMT -> IF ( BEXP ) STMT ELSE STMT\n",linenum++);}
|WHILE '(' BEXP ')' STMT {printf("(%d)\t STMT -> WHILE ( BEXP ) SBLOCK\n",linenum++);}
|DO STMT WHILE '(' BEXP ')' ';' {printf("(%d)\t STMT -> DO SBLOCK WHILE ( BEXP ) ;\n",linenum++);}
;

BEXP:
BEXP OR JOIN {printf("(%d)\tBEXP -> BEXP || JOIN\n",linenum++);}
|JOIN {printf("(%d)\tBEXP -> JOIN \n",linenum++);}
;
JOIN:
JOIN AND EQEXP {printf("(%d)\tJOIN -> JOIN && EQEXP\n",linenum++);}
|EQEXP {printf("(%d)\tJOIN -> EQEXP\n",linenum++);}
;
EQEXP:
EQEXP EQ REL {printf("(%d)\tEQEXP -> EQEXP == REL\n",linenum++);}
|EQEXP NE REL {printf("(%d)\tEQEXP -> EQEXP != REL\n",linenum++);}
|REL {printf("(%d)\tEQEXP -> REL\n",linenum++);}
;
REL:
EXP GT EXP {printf("(%d)\tREL -> EXP > EXP\n",linenum++);}
|EXP LT EXP {printf("(%d)\tREL -> EXP < EXP\n",linenum++);}
|EXP GE EXP {printf("(%d)\tREL -> EXP >= EXP\n",linenum++);}
|EXP LE EXP {printf("(%d)\tREL -> EXP <= EXP\n",linenum++);}
|EXP {printf("(%d)\tREL -> EXP\n",linenum++);}
;
EXP:
EXP '+' TERM {printf("(%d)\tEXP -> EXP + TERM\n",linenum++);}
|EXP '-' TERM {printf("(%d)\tEXP -> EXP - TERM\n",linenum++);}
|TERM {printf("(%d)\tEXP -> TERM\n",linenum++);}
;
TERM:
TERM '*' UNARY {printf("(%d)\tTERM -> TERM * UNARY\n",linenum++);}
|TERM '/' UNARY {printf("(%d)\tTERM -> TERM / UNARY\n",linenum++);}
|UNARY {printf("(%d)\tTERM -> UNARY\n",linenum++);}
;
UNARY:
NOT UNARY {printf("(%d)\tUNARY -> ! UNARY\n",linenum++);}
//|'-' UNARY {printf("(%d)\tUNARY -> - UNARY\n",linenum++);}
|FACTOR {printf("(%d)\tUNARY -> FACTOR\n",linenum++);}
;
FACTOR:
'(' BEXP ')' {printf("(%d)\tFACTOR -> ( BEXP )\n",linenum++);}
|INTEGER {printf("(%d)\tFACTOR -> %d\n",linenum++,$1);}
|REALNUM {printf("(%d)\tFACTOR -> %f\n",linenum++,$1);}
|IDENTIFIER {printf("(%d)\tFACTOR -> %s\n",linenum++,$1);}
|TRUE {printf("(%d)\tFACTOR -> true\n",linenum++);}
|FALSE {printf("(%d)\tFACTOR -> false\n",linenum++);}
;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
如何用flex+bison写语法分析器
http://my.oschina.net/costaxu/blog/107714  背景 这个星期,项目中要使用C++或C语言解析JSON格式的数据,把解析的结果放到一个通用的数据结构。这个通用的数据结构,实际上是作为web服务层(这一层大家可以认为是类似于PHP服务器或webpy的服务器容器)到web页面层(这一层是语法类似PHP脚本或者tornardo模板)的数据传输的协议。
使用自动化语法分析工具BISON
BISON语言的分析,可以让我们把精力专注在语法规则上,而不是具体的分析函数编写上。对整个DBMS我们需要按照BISON),然后由BISON是编译程序的翻译器。BISON自由定义部分: /* 语句这部分被BISON二.语法栈的联合(UNION)UNION{  }   exp : exp ‘+’ exp      | exp ‘/’ exp ;   是表达式,LT_INTEGER对应
语法分析——Bison介绍以及Flex、Bison联合编译
语法分析使用Bison,在前面的博文中提到一些如何在Windows下安装Bison,但是从语法分析开始,我还是在Linux下写实验的,安装了ubuntu,因此需要在Linux下安装Bison,这个安装是比较简单的,只需要在命令行中敲入如下命令:sudo apt-get install bison,同样,安装Flax:sudo apt-get install flex         如,写好
编译原理-用Bison构造语法分析程序-小小计算器
问题描述: 编译原理实验要求构造语法分析程序,实现一个简单计算器的功能 实现功能: 1,基本运算 a) 加、减、乘、除 b) 乘方、开方 c) 位运算:与、或、非 d) 阶乘运算 e) 三角函数运算 f) 可自定义变量并参与运算 2,输出对应于输入的后缀表达式(输入的是中缀表达式) 3,打印语法分析器构造的语法树 代码: 1,myCal.h 一个简单
编译原理实验-FLEX+BISON+DEV C++完美解决方案
某高校注明实验——flex+bison的dev c++环境下的完美使用解决方案
flex&bison编写语法分析器
问题总结 这次实验碰到了许多问题,前后花了好几天的时间,做完后感觉收获颇多。 问题1:字符串指针的内存分配 char* p1="Linwhite"; char* p2; p2=p1; p1初始化时分配了内存空间,p2=p1将p2指向p1指向的内存空间,即p1和p2指向同一内存。 yytext是一个字符指针,它的值是当前扫描到的词。词法分析开始时,yytext指向一块内存(缓冲区)的首
flex与Bison小手册,包含一个编译器的实现源代码
flex与Bison小手册,包含一个编译器的实现源代码,价值很高。英文版,但很容易阅读,很推荐。供大家享用
词法分析实验(Flex和bison)包含实验报告
编译原理的词法分析实验,用flex和bison做的,能识别关键字和自定义的变量。包含与之相对应的实验报告。可以直接拿来交给老师的。
Bison笔记
Bison笔记 2016/1/21 1.语法结构 %{ C/C++头文件、全局文件、全局变量、类型定义 此法分析器yylex(采用lex进行此法分析)和错误打印函数 %} Bison声明区间。定义之后用到的终结符、非终结符、操作符优先级 %% Bison语法规则定义 %% C/C++代码 需要定义prologue区域函数,或者其他代码,生成的c/c++文件会完全拷贝这份代
编译原理--计算器Flex+Bison实现
编译原理试验程序计算器实现