Compiler construction 添加规则时出现bison语法错误

Compiler construction 添加规则时出现bison语法错误,compiler-construction,bison,Compiler Construction,Bison,嗨,我正在尝试做一个非常简单的语法,但当我尝试结合两条规则时,失败得很惨: flex文件: %option never-interactive %option yylineno D [0-9] L [a-zA-Z_] A [a-zA-Z_0-9] WS [ \t\v\n\f] %% "keyword" { printf("KEYWORD: %s\n", yytext); return KEYWORD; } [+-]?{D}+ { yylval = at

嗨,我正在尝试做一个非常简单的语法,但当我尝试结合两条规则时,失败得很惨:

flex文件:

%option never-interactive
%option yylineno


D   [0-9]
L   [a-zA-Z_]
A   [a-zA-Z_0-9]
WS  [ \t\v\n\f]

%%
"keyword"       { printf("KEYWORD: %s\n", yytext); return KEYWORD; }
[+-]?{D}+       { yylval = atoi(yytext); return L_SINT32; }
{L}{A}*     { printf("ID: %s\n", yytext); return IDENTIFIER;    }
";"         { return EOS;       }
{WS}        { }
.           { printf("OTHER\n"); return 0; }

%%
以及相应的bison文件:

%token L_SINT32
%token EOS
%token IDENTIFIER KEYWORD
%start stmt_list

%%


idlist  : IDENTIFIER        { printf("IDENT\n"); }
    | idlist IDENTIFIER { printf("IDENT, IDENT\n"); }
    ;

stmt    : KEYWORD IDENTIFIER ';'
    | idlist ';'    { printf("EXP\n"); }
    ;

stmt_list
    : stmt
    | stmt_list stmt
;

%%
当我尝试在输入上使用它时

id0 id1 id2;
keyword id1;
我得到:

ID: id0
IDENT
ID: id1
IDENT, IDENT
ID: id2
IDENT, IDENT
error -> syntax error

有人能告诉我为什么吗?

当你的词法分析器看到分号时:

";"         { return EOS;       }
您的解析器正在查找的内容:

| idlist ';'    { printf("EXP\n"); }
EOS
将由bison创建一些值并放入生成的头文件中;可能是258<代码>';'的值为
';'(即
0x3B
59


我会去掉EOS,只返回“;”来自lexer。

谢谢,救了我一天,问题确实出在返回的lexem中!