为什么Bison总是给我“ x线附近的语法错误”?

时间:2019-10-27 14:19:54

标签: bison lex

我目前正在研究一个flex / bison项目,该项目包括识别给定文件中的语法错误。 我已经写了包含规则的解析器和lex文件,但是我认为它有问题,因为无论我将哪个文件提供给程序,我都会收到以下消息“第1行附近的语法错误” ,例如对于 int r1; 之类的基本行。 所以这是我的.lex文件,其中包含我的所有规则:

tbody

还有我的.y文件:

    %{
#include <stdlib.h>
#include <stdio.h>
#include "tpc-2019-2020.h"
int lineno = 1; 
%}

%option nounput
%option noinput
%x COMMENT

%%
<COMMENT>"*/" BEGIN INITIAL;
"/*" {printf("ok\n"); BEGIN COMMENT;}
"//".* ; 
<COMMENT>. ;
<COMMENT>\n ; lineno++;
int { return TYPE; }
char { return TYPE; }
";" { return 0; }
[ \t] {};
[0-9]* { return NUM; }
\n { lineno++; }
void { return VOID; }
print { return PRINT; }
while { return WHILE; }
readc { return READC; }
reade { return READE; }
[a-zA-Z] { return CHARACTER; }
[a-zA-Z][a-zA-Z0-9_]* { return IDENT; }
\+|- { return ADDSUB; }
\=\= { return EQ; }
\!\= { return EQ; }
\< { return ORDER; }
\<\= { return ORDER; }
\> { return ORDER; }
\>\= { return ORDER; }

\|\| { return OR; }
\&\& { return AND; }
. return yytext[0];

%%

使用这些文件,即使我的输入文件只是: int r1,r2;

它给我“语法错误第1行”

我试图只在文件中添加一些注释行,但得到的消息是“ OK”,这意味着我的规则可以识别注释行,但是即使我每次都总是得到相同的“第1行附近的语法错误”。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的语法说一个声明看起来像这样:

DeclVars:
   DeclVars TYPE Declarateurs ';' 

换句话说,每个声明以分号结尾。

但是您的扫描仪永远不会返回分号:

";" { return 0; }

当扫描仪到达分号时,它将返回输入结束指示符。因此,由于缺少分号,所以解析失败。

启用bison traces将使这一点更加明显。