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 文件中使用 "="
(双引号)不会如你所愿——你想使用 '='
(单引号)来匹配单个文字字符。
我只是想知道是否可以让 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 文件中使用 "="
(双引号)不会如你所愿——你想使用 '='
(单引号)来匹配单个文字字符。