こんにちは、私は非常に単純な文法を作成しようとしていますが、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; }
%%
および対応する 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
誰かが私にそれがなぜなのか指摘できますか?