fengwufeiyang01 2013-12-21 07:15
浏览 1752

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++);}
;

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?