Flex 不识别标识符
Flex does not recognize identifiers
我正在尝试使用 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
定义(或者从头开始重新输入,一切都应该没问题。
我正在尝试使用 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
定义(或者从头开始重新输入,一切都应该没问题。