我正在编写一个简单的 yacc 程序来检查语法。我应该能够做一些类似的事情
int a[100];
我的程序中有很多打印语句,因此您可以看到发生了什么。而不是说
INT found
VAR NAME found
CHAR found
NUMBER found
CHAR found
CHAR found
它说的是
INT found
VAR NAME found
VAR NAME found
syntax error
在我的 YACC 文件中,我有
type VARNAME '[' NUM ']' ';'
int 我的 lex 文件
[=\-+*/%&|\[\]();{}<>!] { //return the symbols
fprintf(stderr,"CHAR found\n");
return (*yytext);
}
[a-zA-z][a-zA-Z0-9]* { //ID can start with any letter and end with letters and numbers.
fprintf(stderr,"VAR NAME found\n");
yylval.string=strdup(yytext);
return(ID);
}
这是与此问题相关的唯一代码。从我所看到的情况来看,与 CFG 没有不一致的地方,所以我不确定问题出在哪里。
最佳答案
我完全同意EJP's suggestion您可以在扫描仪定义末尾用简单的后备规则替换一长串特殊字符。但这不是问题的原因。
原因是一个简单的拼写错误:ID
的第一个字符的模式是 [a-zA-<b>z</b>]
,而不是 [a-zA-<b>Z</b>]
。前一种模式匹配 Z 和 a 之间的字符,其中包括 [ 和 ]。所以,[100]
是 ID
根据您的规范。
就个人而言,我建议使用 Posix 字符类,编写:
[[:alpha:]][[:alnum:]]*
或者,如果您想包含 _(也位于 Z 和 a 之间):
[[:alpha:]_][[:alnum:]_]*
关于yacc - Lex 正在将 [ 识别为字母字符串而不是字符的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28713955/