Regex 命名变量与其他令牌标识符不明确
我使用一个lexer,需要能够识别命名变量和关键字之间的差异 更详细地说,在我的.l文件中,我有如下定义Regex 命名变量与其他令牌标识符不明确,regex,yacc,flex-lexer,lex,Regex,Yacc,Flex Lexer,Lex,我使用一个lexer,需要能够识别命名变量和关键字之间的差异 更详细地说,在我的.l文件中,我有如下定义 "QUIT" {return QUIT;} "AND" {return AND;} "XOR" {return XOR;} 还有一个名称的定义(对于变量) 我的问题是,我的关键字,如QUIT、AND、XOR,每一个都满足名称规则,这就给我留下了模棱两可的问题 我如何解决这个问题?将关键字放在第一位 Flex生成的扫描仪始终选择最长的匹配;如果可以应用多个图案,则选择第一个图案。因此,如
"QUIT" {return QUIT;}
"AND" {return AND;}
"XOR" {return XOR;}
还有一个名称的定义(对于变量)
我的问题是,我的关键字,如QUIT、AND、XOR,每一个都满足名称规则,这就给我留下了模棱两可的问题
我如何解决这个问题?将关键字放在第一位 Flex生成的扫描仪始终选择最长的匹配;如果可以应用多个图案,则选择第一个图案。因此,如果你有:
QUIT {return QUIT;}
AND {return AND;}
XOR {return XOR;}
[a-zA-Z][a-zA-Z0-9]* { memcpy(yylval.name, yytext, yyleng + 1); return NAME; }
[[:space:]]+ /* Ignore */
您的输入是:
QUITAND QUIT AND
然后,扫描仪将返回三个令牌:NAME
、QUIT
、和
。如果您先放置NAME
模式,那么您将得到三个NAME
令牌。(在flex模式中不需要引用字母数字字符。需要引用的是正则表达式运算符。)
memcpy
不是一个好主意。我修改了它以避免对strlen的冗余调用,这实际上是最小的问题。我假设您将它与yylval.name
声明组合为一个固定长度的字符数组。如果是这样,您应该验证名称是否太长,无法放入提供的空间中。但这仍然是一个坏主意,因为bison生成的解析器假定堆叠的值不是太大;当生成的代码更方便时,它不会试图避免复制它们。谢谢!这就是我要找的!
QUITAND QUIT AND