使用 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]*
。
我正在使用 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]*
。