编写一个使用以下产品和操作的解析器(Yacc和Lex文件):
S -> cSS {print “x”}
S -> a {print “y”}
S -> b {print “z”}
指示输入为cacba
时将打印的字符串。
我收到此错误:当我给它输入时,它表示有效输入并且还说语法错误。
我的扫描程序代码就是这个
%{
#include "prac.h"
%}
%%
[c] {return C; }
[a] {return A; }
[b] {return B; }
[ \t] ;
\n { return 0; }
. { return yytext[0]; }
%%
int yywrap(void) {
return 1;
}
我的yacc代码是这样的:
%{
#include <stdio.h>
%}
%token A B C
%%
statement: S {printf("Valid Input"); }
;
S: C S S {printf("Print x\n");}
| A {printf("Print y\n");}
| B {printf("Print z\n");}
;
%%
int main()
{
return yyparse();
}
yyerror(char *s)
{
printf("\n%s\n",s);
printf("Invalid Input");
fprintf(stderr,"At line %d %s ",s,yylineno);
}
我该如何解决这个问题?
答案 0 :(得分:0)
(Comments converted to an answer)
@ChrisDodd写道:
最佳猜测 - 您正在Windows上运行,因此您在换行符之前获得
\r
(回车)字符,这会导致您的错误。尝试将\r
添加到[ \t]
模式以忽略它。
@Cyclone写道:
OP写道:将您的
fprintf()
声明更改为fprintf(stderr, "At line %d %s", yylineno, s);
,而不是它会解决您的问题。
您的意思是我应该将
\r
添加到\t
中,以便新的正则表达式为[\r\t]
我是否正确?
@rici写道:
@chris建议
[ \r\t]
。如果你在循环中的某个地方有Windows,我同意。