【问题标题】:bison grammar error when adding a rule添加规则时出现野牛语法错误
【发布时间】:2024-05-02 16:20:07
【问题描述】:

您好,我正在尝试制作一个非常简单的语法,但当我尝试结合 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

谁能指出这是为什么?

【问题讨论】:

    标签: compiler-construction bison


    【解决方案1】:

    当您的词法分析器看到分号时:

    ";"         { return EOS;       }
    

    您的解析器正在寻找什么:

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

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

    我会摆脱 EOS,只从词法分析器中删除 return ';'

    【讨论】:

    • 谢谢,救了我的命,问题确实出在返回的词法上!