我正在使用Python / lex编写解析器并尝试创建一个删除C风格注释的条目。我当前(错误的)尝试是:
def t_comment_ignore(t):
r'(\/\*[^*]*\*\/)|(//[^\n]*)'
pass
这产生了一个困扰我的怪癖。当我解析下面的字符串时:
input = """
if // else mystery
=/*=*/=
true /* false
*/ return"""
输出令牌是:
['IF', 'EQUAL', 'TIMES', 'EQUAL', 'DIVIDE', 'EQUAL', 'TRUE', 'RETURN']
显然第3行的评论未被正确识别,其中3个符号作为代币返回。
但如果我在第3行的评论之前添加一个空格,即:
input = """
if // else mystery
= /*=*/=
true /* false
*/ return"""
我明白了:
['IF', 'EQUAL', 'EQUAL', 'TRUE', 'RETURN']
调试显示添加了额外空格时,所有3条注释都被正确识别。
好吧,我对这种行为感到非常困惑。任何意见都表示赞赏。
谢谢, 圣保罗
PS:有些人可能已经注意到,这个辣酱玉米饼馅来自https://www.udacity.com/wiki/cs262中的问题集2。他们使用lex的另一个功能提供了更精细的解决方案,但我想知道我的方法是否合理以及我的代码是否可以修复。
答案 0 :(得分:1)
我的猜测是,您的EQUALS模式与=.
匹配,而不是{或1}}。=
。
顺便说一下,正确的评论模式是/[*][^*]*[*]+([^/*][^*]*[*]+)*/|//[^\n]*
。