yacc - Lex 正在将 [ 识别为字母字符串而不是字符的一部分

标签 yacc lex

我正在编写一个简单的 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>] 。前一种模式匹配 Za 之间的字符,其中包括 []。所以,[100]ID根据您的规范。

就个人而言,我建议使用 Posix 字符类,编写:

[[:alpha:]][[:alnum:]]*

或者,如果您想包含 _(也位于 Za 之间):

[[:alpha:]_][[:alnum:]_]*

关于yacc - Lex 正在将 [ 识别为字母字符串而不是字符的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28713955/

相关文章:

python - 用于累积逗号分隔值列表的 PLY YACC pythonic 语法

bison - 如何解决减少减少冲突 :

c - C 预处理器指令的 Lex 规则

c++ - C 中的 Flex 在 64 位 Windows 7 计算机上编译时生成不受支持的 16 位应用程序

c - boolean 表达式求值器错误

c++ - 添加printf语句时NULL指针异常消失

yacc - 用于 LOGO(或 Turtle)编程语言的 Lex/Yacc 语法文件

c - 使用 struct 将操作添加到我的 yacc 文件

parsing - Bison 语法中的浮点被截断

c++ - 柔性/莱克斯 : Regular Expression matches double characters