[问题] lex&yacc 简易计算

楼主: aa1727 (帮我加油好吗)   2018-12-17 10:29:38
要写一个 支援+-*/()和负数的计算程式
但是导入测资之后一切正常 就是最后一个测资的Ans不能跑出来反而跳到error 不知道哪
里有问题
————————————————
程式码:
Lex:
%{
#include <stdio.h>
#include "y.tab.h"
%}
%option noyywrap
%%
[0-9]+ { yylval = atoi(yytext); return INTEGER; }
[\+\-\*\/\(\)\n] { return *yytext; }
[\t] {}
. { yyerror("invalid char."); }
%%
————————————————-
Yacc:
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
int yylex();
%}
%token INTEGER
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%%
program:
|program expression '\n' { printf("Ans : %d\n\n", $2); }
;
expression :
INTEGER { $$ = $1; }
| expression '+' expression { $$ = $1 + $3;
printf("%d + %d = %d \n",$1,$3,$$);}
| expression '-' expression { $$ = $1 - $3;
printf("%d - %d = %d \n",$1,$3,$$);}
| expression '*' expression { $$ = $1 * $3;
printf("%d * %d = %d \n",$1,$3,$$);}
| expression '/' expression { $$ = $1 / $3;
printf("%d / %d = %d \n",$1,$3,$$);}
| '-' expression %prec UMINUS { $$ = -$2; }
| '(' expression ')' { $$ = $2; }
| { yyerror("invalid input.\n"); }
;
%%
int main()
{
yyparse();
return 0;
}
void yyerror(char *msg)
{
printf("Error: %s \n",msg);
}
———————————————-
编译结果:
https://i.imgur.com/sRw39qw.jpg
最后一行都会是syntax error
不知道是不是发这个版 里面有写C应该是?!
找bug找很久但是找不到
求大神相救
作者: nh60211as   2018-12-17 10:52:00
你最后一组测资有换行吗
作者: cutekid (可爱小孩子)   2018-12-17 13:07:00
t.txt ← 可以上传到网络嘛,方便 debug
作者: aa0917954358 (Doem)   2018-12-18 00:16:00
expression最后一个推导成yyerror那行删掉呢?
作者: Lipraxde (Lipraxde)   2018-12-18 14:38:00
program是不是要加一个变成expression '\n',不然好像没办法结束?

Links booklink

Contact Us: admin [ a t ] ucptt.com