嗨,当我尝试结合 2 条规则时,我正在尝试制作一个非常简单的语法并惨遭失败:
弹性文件:
%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
有人可以指出我为什么会这样吗?