flex(python PLY)正则表达式字符串

时间:2012-08-22 06:42:20

标签: ply

我正在使用python模块PLY编写解析器,我正在实现。我有一个简单的规则来检测字符串:

r'("|\').*("|\')'

当抛出lexer错误时,我有这个:

def t_error (t) :
    print 'Illegal lexer input line ' + str(t.lineno) + ' ' + t.value[:16]
    sys.exit(-1)

当我向解析器提供以下输入时:

parse("preg_match('%^[\*\%]+$%', $keywords)")

我得到了回报:

Illegal lexer input line 1 %^[\*\%]+$%', $k

我的问题是:

1)为什么我不解析这个字符串?看起来我的正则表达式应该正确处理这个字符串。

2)我该如何解决这个问题?

编辑:

我已经把问题缩小了一点。以下字符串会自行抛出非法词法分析器输入错误:

'%'
'^'

1 个答案:

答案 0 :(得分:1)

即使这个正则表达式正在运行,它也不是完全做你想要的,例如它会接受"this',这实际上不是一个字符串。这也是“非法lexer输入”的原因......

完成它的工作并找到"preg_match('中的第一个字符串后,当下一个11个字符%^[\*\%]+$%中的每一个都是非法的(而不是t_ignore)时,词法分析器会被打乱。它们甚至不以"'开头。

尝试使用"'的两种情况执行此操作:“以引号开头,一些不引用的内容,以引号结尾。”即:

r'("[^"]*")|(\'[^\']*\')'

或者,如果您想要包含转义语音标记:

r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')'