为什么我生成的Flex/Bison解析器即使是';规则中增加了什么?

为什么我生成的Flex/Bison解析器即使是';规则中增加了什么?,bison,flex-lexer,Bison,Flex Lexer,我正在尝试实现一个简单的flex/bison代码,它将像程序一样检查C: main(){ x = 3; print x; } 但是当我向程序提供这个输入时,它无法与我在flex文件中提到的规则匹配。下面是我的flex和bison文件代码: 计算 %{ #include <stdio.h> #include <string.h> #include "calc.tab.h" int lineno = 1; %} digit [0-9]+ id [a-z][a

我正在尝试实现一个简单的flex/bison代码,它将像程序一样检查C:

main(){
x = 3;
print x;
}
但是当我向程序提供这个输入时,它无法与我在flex文件中提到的规则匹配。下面是我的flex和bison文件代码:

计算

%{
#include <stdio.h>
#include <string.h>
#include "calc.tab.h"
int lineno = 1;
%}

digit   [0-9]+
id      [a-z][a-zA-Z0-9]*

%%
{digit}+    { yylval.num = atoi(yytext); return TOK_NUMBER; }
"main"      { return TOK_MAIN; }
"("         { return TOK_ORBRACKET; }
")"         { return TOK_CRBRACKET; }
"{"         { return TOK_OCBRACKET; }
"}"         { return TOK_CCBRACKET; }
"print"     { return TOK_PRINT; }
{id}        { sscanf(yytext, "%s", (yylval.index)); return TOK_VARIABLE; }
";"         { return TOK_SEMICOLON; }
"+"         { return TOK_ADD; }
"*"         { return TOK_MUL; }
"(-{digit}+)" { return TOK_NEGNUM; } 
"="         { return TOK_EQUAL; }
[ \t]+      { }
[ \n]+      { lineno++; }
.           { printf("Lexical error:'%c'\n", yytext[0]); }

%%
提前感谢您的帮助。

两个问题:

消息
'exical error:'
来自解析文件中的DOS样式
\r\n
行结尾。您应该将它们转换为
\n
结尾,或者在解析器中使用
\r
字符,例如通过扩展规则

[ \t]+      { }

消息
解析错误:第4行和语法错误
来自解析器中的逻辑缺陷。这里

stmts:
    | stmt TOK_SEMICOLON stmts
;
指定每个
stmt
以分号结尾。但是这里

stmt:
    expr TOK_SEMICOLON
    | TOK_PRINT expr TOK_SEMICOLON      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;
expr
TOK_PRINT expr
之后还需要分号。所以这行后面需要两个分号

print x;;
但您可能希望删除冗余的
TOK_分号
,如下所示:

stmt:
    expr
    | TOK_PRINT expr      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;
然后,您的文件应该按照预期进行解析

stmt:
    expr TOK_SEMICOLON
    | TOK_PRINT expr TOK_SEMICOLON      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;
print x;;
stmt:
    expr
    | TOK_PRINT expr      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;