用于以下语法的解析器程序

时间:2015-01-21 06:41:50

标签: 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 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);
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Comments converted to an answer

@ChrisDodd写道:

  

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

@Cyclone写道:

  

将您的fprintf()声明更改为fprintf(stderr, "At line %d %s", yylineno, s);,而不是它会解决您的问题。

OP写道:

  

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

@rici写道:

  

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