c - Flex 不识别标识符

标签 c parsing flex-lexer

我正在尝试使用 flex 实现一个非常简单的解析器。我目前卡在ID识别中。那是我的代码:

ID [a−zA−Z_][a−zA−Z0−9_]*
...
{ID} { printf( "An identifier: %s\n", yytext ); return TOK_ID;}

但是我得到的只是标识符的第一个字母,例如如果我尝试解析:

int _underscore ;

结果是:

An identifier: _

有什么建议吗?

编辑:

通过更准确的分析,我发现代码只能识别带有 a、z、A、Z、_ 的 id,它们是正则表达式中的显式字符。我在网上没有找到类似的东西,这是一个错误吗?

编辑2:

如果我以这种方式修改代码,一切正常

ID [a−zA−Z_][a−zA−Z0−9_]*
...
[a−zA−Z_][a−zA−Z0−9_]* { printf( "An identifier: %s\n", yytext ); return TOK_ID;}

根据文档,它也应该以其他方式工作。

最佳答案

这是一个字符编码问题。在您复制粘贴的源代码中,您的 ID 定义中看起来像 ASCII 连字符(-,代码 U+2D)的内容:

ID [a−zA−Z_][a−zA−Z0−9_]*

不是。相反,它们是 unicode 减号 (, U+2212)。如果用正确的连字符替换不正确的减号,该行将如下所示:

ID [a-zA-Z_][a-zA-Z0-9_]*

根据您的字体,如果您非常仔细观察,您可能会发现第一个版本中的 -- 之间的差异在第二个。

无论如何,用上面的第二个版本替换你的 ID 定义(或者从头开始重新输入,一切都应该没问题。

关于c - Flex 不识别标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48611979/

相关文章:

c - 哪些参数决定处理器数据类型的大小?

parsing - Go 解析器未检测到结构类型的文档注释

flex-lexer - 使用flex,当到达EOF并且通过YY_INPUT提供输入时,如何保留yytext内容?

c - lextestpass.l :384: error: expected expression before ‘int’

c - 如何在没有 getopt 的情况下解析 c 中的命令行参数?

c - 可读性与可维护性 : Condensing statements to loops

c - 如何从十六进制值中提取低位字节?

PHP DOMDocument - 获取 BODY 的 html 源代码

parsing - 高效灵活的二进制数据解析

c++ - 在 Windows 上使用 MinGW 构建黄金链接器,未在此范围内声明 FLEX/bison 'YYSTYPE'