0

こんにちは、私は非常に単純な文法を作成しようとしていますが、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

誰かが私にそれがなぜなのか指摘できますか?

4

1 に答える 1

1

レクサーがセミコロンを検出した場合:

";"         { return EOS;       }

パーサーが探しているもの:

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

EOSbison によって作成され、生成されたヘッダー ファイルに入れられる何らかの値があります。';'それは258 かもしれ';'ませ0x3B59

私はEOSを取り除きreturn ';'、レクサーからだけです。

于 2013-09-30T16:27:28.057 に答える