我正在使用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)我该如何解决这个问题?
编辑:
我已经把问题缩小了一点。以下字符串会自行抛出非法词法分析器输入错误:
'%'
'^'
答案 0 :(得分:1)
即使这个正则表达式正在运行,它也不是完全做你想要的,例如它会接受"this'
,这实际上不是一个字符串。这也是“非法lexer输入”的原因......
完成它的工作并找到"preg_match('
中的第一个字符串后,当下一个11个字符%^[\*\%]+$%
中的每一个都是非法的(而不是t_ignore
)时,词法分析器会被打乱。它们甚至不以"
或'
开头。
尝试使用"
和'
的两种情况执行此操作:“以引号开头,一些不引用的内容,以引号结尾。”即:
r'("[^"]*")|(\'[^\']*\')'
或者,如果您想要包含转义语音标记:
r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')'