嗨,我试图制作一个非常简单的语法,当我试图结合两条规则时,我的惨遭失败:
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
有人能指出我为什么会这样吗?
答案 0 :(得分:1)
当词法分析器看到分号时:
";" { return EOS; }
您的解析器正在寻找:
| idlist ';' { printf("EXP\n"); }
EOS
将有一些由bison创建的值并放入生成的头文件中;它可能是258.另一方面,';'
的值为';'
(即0x3B
或59
)。
我将从词法分析器中删除EOS而只是return ';'
。