我正在尝试使用flex实现一个非常简单的解析器。我现在被身份识别卡死了。这是我的密码:

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、u(正则表达式中的显式字符)的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定义(或者从头开始重新输入,一切都应该正常。

07-28 00:54
查看更多