使用 lex 删除注释:为什么这不起作用?

Removing comments using lex: why doesn't this work?

我正在使用 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行的注释前加一个space,即:

input = """
if // else mystery  
= /*=*/= 
true /* false 
*/ return"""

我得到:

['IF', 'EQUAL', 'EQUAL', 'TRUE', 'RETURN']

调试显示当添加额外的 space 时,所有 3 条评论都被正确识别。

好吧,我对这种行为感到非常困惑。欢迎任何意见。

谢谢, 保罗

PS:有些人可能已经注意到,这个辣酱玉米饼馅来自 https://www.udacity.com/wiki/cs262 中的问题集 2。他们使用 lex 的另一个功能提供了更详尽的解决方案,但我想知道我的方法是否合理以及我的代码是否可修复。

我的猜测是您的 EQUALS 模式匹配 =. 而不是(或同时匹配)=

顺便说一句,正确的评论模式是/[*][^*]*[*]+([^/*][^*]*[*]+)*/|//[^\n]*