为什么我生成的Flex/Bison解析器即使是';规则中增加了什么?
我正在尝试实现一个简单的flex/bison代码,它将像程序一样检查C:为什么我生成的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
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
;