1

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

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

当抛出词法分析器错误时,我有这个:

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)我该如何解决这个问题?

编辑:

我把问题缩小了一点。以下字符串本身会引发非法的词法分析器输入错误:

'%'
'^'
4

1 回答 1

2

即使这个正则表达式正在工作,它也并没有完全按照你的意愿去做,例如它会接受"this',这不是一个真正的字符串。这也是“非法词法输入”的原因......

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

.

"尝试对and使用两种情况'“以引号开头,一些不是引号的东西,以引号结尾。” 那是:

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

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

r'("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')'
于 2012-09-02T23:21:32.267 回答