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

时间:2015-04-30 04:30:23

标签: python lex ply

我正在使用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的另一个功能提供了更精细的解决方案,但我想知道我的方法是否合理以及我的代码是否可以修复。

1 个答案:

答案 0 :(得分:1)

我的猜测是,您的EQUALS模式与=.匹配,而不是{或1}}。=

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