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

问题描述

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() SBLOCKn",linenum++);}
;

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

DECLS:
DECLS DECL {printf("(%d)tDECLS -> DECLS DECLn",linenum++);}
| {printf("(%d)tDECLS -> en",linenum++);}
;

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

STMTS:
STMTS STMT {printf("(%d)tSTMTS -> STMTS STMTn",linenum++);}
| {printf("(%d)tSTMTS -> en",linenum++);}
;

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

BEXP:
BEXP OR JOIN {printf("(%d)tBEXP -> BEXP || JOINn",linenum++);}
|JOIN {printf("(%d)tBEXP -> JOIN n",linenum++);}
;
JOIN:
JOIN AND EQEXP {printf("(%d)tJOIN -> JOIN && EQEXPn",linenum++);}
|EQEXP {printf("(%d)tJOIN -> EQEXPn",linenum++);}
;
EQEXP:
EQEXP EQ REL {printf("(%d)tEQEXP -> EQEXP == RELn",linenum++);}
|EQEXP NE REL {printf("(%d)tEQEXP -> EQEXP != RELn",linenum++);}
|REL {printf("(%d)tEQEXP -> RELn",linenum++);}
;
REL:
EXP GT EXP {printf("(%d)tREL -> EXP > EXPn",linenum++);}
|EXP LT EXP {printf("(%d)tREL -> EXP < EXPn",linenum++);}
|EXP GE EXP {printf("(%d)tREL -> EXP >= EXPn",linenum++);}
|EXP LE EXP {printf("(%d)tREL -> EXP <= EXPn",linenum++);}
|EXP {printf("(%d)tREL -> EXPn",linenum++);}
;
EXP:
EXP '+' TERM {printf("(%d)tEXP -> EXP + TERMn",linenum++);}
|EXP '-' TERM {printf("(%d)tEXP -> EXP - TERMn",linenum++);}
|TERM {printf("(%d)tEXP -> TERMn",linenum++);}
;
TERM:
TERM '*' UNARY {printf("(%d)tTERM -> TERM * UNARYn",linenum++);}
|TERM '/' UNARY {printf("(%d)tTERM -> TERM / UNARYn",linenum++);}
|UNARY {printf("(%d)tTERM -> UNARYn",linenum++);}
;
UNARY:
NOT UNARY {printf("(%d)tUNARY -> ! UNARYn",linenum++);}
//|'-' UNARY {printf("(%d)tUNARY -> - UNARYn",linenum++);}
|FACTOR {printf("(%d)tUNARY -> FACTORn",linenum++);}
;
FACTOR:
'(' BEXP ')' {printf("(%d)tFACTOR -> ( BEXP )n",linenum++);}
|INTEGER {printf("(%d)tFACTOR -> %dn",linenum++,$1);}
|REALNUM {printf("(%d)tFACTOR -> %fn",linenum++,$1);}
|IDENTIFIER {printf("(%d)tFACTOR -> %sn",linenum++,$1);}
|TRUE {printf("(%d)tFACTOR -> truen",linenum++);}
|FALSE {printf("(%d)tFACTOR -> falsen",linenum++);}
;

时间: 2024-11-01 12:52:26

ubuntu下bison编写语法分析器的问题的相关文章

camera+-ubuntu下qtcreator工程中利用opencv编写工程,摄像头无法第二次打开

问题描述 ubuntu下qtcreator工程中利用opencv编写工程,摄像头无法第二次打开 ubuntu下qtcreator工程中利用opencv编写工程,opencv库操作,摄像头第一次可以正常使用,一旦点击停止键后,无法第二次打开,再次运行时就会报错.libv4l2: error turning on stream: Invalid argument cap 在析构函数中我有作释放.请问这是什么原因啊?? ---------------- VideoCapture cap; cap.op

am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试

StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要很大,系统只有几个M而已.3.如果你按默认路径安装,那请去C:\ti\AM335X_StarterWare_02_00_00_07\tools\sd_format下面执行TI_SDCard_boot_utility_v1_0.exe 4.在路径 C:\ti\AM335X_StarterWare_02

Ubuntu下安装Go语言开发环境及编辑器的相关配置_Golang

安装 Windows下是直接的安装包,这里我们略过,来看一下Ubuntu下安装Go: sudo add-apt-repository ppa:gophers/go sudo apt-get update sudo apt-get install golang-stable 或 sudo apt-get install golang 或者直接下载go语言安装包 环境配置: vi /etc/profile 加入 export GOROOT=/usr/lib/go export GOARCH=386

可配置语法分析器开发纪事(二) 构造符号表

上一篇博客讲到了构造语法树的问题.有朋友在留言问我,为什么一定要让语法分析器产生语法树,而不是让用户自己决定要怎么办呢?在这里我先解答这个问题. 1.大部分情况下都是真的需要有语法树 2.如果要直接返回计算结果之类的事情的话,只需要写一个visitor运行一下语法树就好了,除去自动生成的代码以外(反正这不用人写,不计入代价),代码量基本上没什么区别 3.加入语法树可以让文法本身描述起来更简单,如果要让程序员把文法单独放在一边,然后自己写完整的语义函数来让他生成语法树的话,会让大部分情况(需要语法

运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行脚本的问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1676490 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?

问题描述 linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况? 初学,linux(ubuntu)环境下,如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?初学者,希望从这些基础程序入手,谢谢大家~ 解决方案 读取proc下面的文件. /proc/stat 里面是CPU使用情况,/proc/meminfo里面是内存使用情况,进程信息在/proc/$pid/stat,statm里面. /proc/net/dev里面是网络使用情况,磁盘IO可以使用iostat命令

ubuntu下安装 gSOAP 用于C/C++开发web service服务端与客户端

昨天在ubuntu下进行安装gSOAP,费了很多时间,没成功,今天又来找了大量教程资料,终于一次成功,这里写下自己的安装步骤和方法,供大家参考. 首先下载gsoap,我下载的是gsoap-2.8.1.zip 用unzip gsoap-2.8.1.zip命令解压缩,会解压生成gsoap-2.8文件夹. cd gsoap-2.8   在安装之前需要先安装一些编译工具.     安装编译工具: $sudo apt-get install build-essential 为了成功编译gSOAP,您需要安

在Ubuntu下采用Codeblocks开发菜单问题

问题描述 在Ubuntu下采用Codeblocks开发菜单问题 1C 在Ubuntu下采用Codeblocks开发界面程序,即选择wxwidget界面库开发的时候,我已经增加了一个菜单项,但不知道如何增加菜单的消息函数?(系统自己已经增加了两个菜单项,这两个菜单项对应的消息函数已经编写好了) 解决方案 CodeBlocks插件开发指南 这里有关于菜单的相关代码 http://blog.chinaunix.net/uid-23065002-id-4287216.html

linux c+ stat+-为什么在ubuntu下调用stat函数,执行路径不同,结果也会不同?

问题描述 为什么在ubuntu下调用stat函数,执行路径不同,结果也会不同? 在ubuntu下编写判断一个文件是否目录得程序,调用了sys/stat.h头文件中得stat函数,生成可执行文件后,在不同路径下执行结果是不一样得,烦请各位大神帮忙看一下是什么情况,多谢多谢(没分额). 说明: 在我得电脑上,程序存放得绝对路径是/home/xiaoming/Desktop/linuxStudy/filesystem/,执行程序时,分别在/home/xiaoming/Desktop/linuxStud