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; }

%%

和相应的野牛文件:

%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"); }

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

我会摆脱 EOS 而只是return ';'从词法分析器中。

于 2013-09-30T16:27:28.057 回答