添加规则时的bison语法错误

时间:2013-09-30 11:05:42

标签: 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 = atoi(yytext); return L_SINT32; }
{L}{A}*     { printf("ID: %s\n", yytext); return IDENTIFIER;    }
";"         { return EOS;       }
{WS}        { }
.           { printf("OTHER\n"); return 0; }

%%

和相应的野牛档案:

%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

有人能指出我为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

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

";"         { return EOS;       }

您的解析器正在寻找:

| idlist ';'    { printf("EXP\n"); }

EOS将有一些由bison创建的值并放入生成的头文件中;它可能是258.另一方面,';'的值为';'(即0x3B59)。

我将从词法分析器中删除EOS而只是return ';'