Regex 以下语法的语法分析器程序

Regex 以下语法的语法分析器程序,regex,compiler-construction,yacc,lex,Regex,Compiler Construction,Yacc,Lex,编写一个使用以下产品和操作的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

编写一个使用以下产品和操作的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);
}
如何解决此问题?

@克里斯多德写道:


最佳猜测-您正在windows上运行,因此在换行符之前\r将获得一个回车符,这将导致您的错误。尝试将\r添加到[\t]模式以忽略它

@旋风写道:

将fprintf语句更改为fprintfstderr,在第%d%s行,yylineno,s;这并不能解决你的问题

OP写道:

您的意思是我应该将\r\t添加到\t中,以便它的新正则表达式为[\r\t],对吗

@里希写道:

@chris建议[\r\t]。如果你在循环中的某个地方有窗口,我同意


您将给出什么输入?最佳猜测-您正在windows上运行,因此在换行符之前会得到一个\r回车符,这将导致您的错误。尝试将\r添加到[\t]模式以忽略它。我删除了我的答案,因为它似乎不适合您。仍将第%d%s行yylineno,s处的fprintf语句更改为fprintfstderr;并不是说它能解决你的问题。@rici我给它输入cacba,但它说syantaxerror@UsamaLucky-我可以向您发送为我工作的完整代码,遗憾的是,有些人很快就投了反对票=是的,您可以按照我在lex中展示的方式使用regularexpression,但是有些人。。。。