Yacc/Lex: 拒绝未定义的符号

Yacc/Lex: Rejecting symbols not defined

我只是想知道是否可以让 YACC 报告所有未在 LEX 文件中定义的符号的语法错误。

例如

莱克斯文件

/*dummy.l*/
%{
#include "dummy.tab.h"

%%

int    return INT;
[a-z]+ return ID;
[0-9]+ return NUM;

%%

yacc 文件

/*dummy.y*/
%token INT ID NUM

%% 
var : INT ID "=" NUM ";" 
%%

int main(void) {
    yyparse();
}

假设我有这 2 个文件,如何使我的程序在

时报告语法错误

$(美元符号)出现在输入中。

例如。它仍然会接受输入

int a = 234; $

注意:我想拒绝所有不是定义的符号

您需要添加 lex 规则以将所有输入文本识别为某种标记。通常我使用:

.|\n    return *yytext;

作为 lex 文件中的最后一个模式。这确保没有输入会触发 lex default ECHO 操作。如果您对 \n 有其他规则(例如忽略它),则不需要此处的 \n

另一个注意事项——在 yacc 文件中使用 "="(双引号)不会如你所愿——你想使用 '='(单引号)来匹配单个文字字符。