0

我正在 python 中使用 ply 构建一个词法分析器。我有 2 个标记,称为 TkConjuncion(指逻辑与)和 TkDisjuncion(指逻辑与)。

两者的规则都写如下(还有其他规则,但不相关):

t_TkDisjuncion = '\\\/'
t_TkConjuncion = '\/\\'

在哪里和\\\/是。但是当我测试我的代码时,它说:\/\/\\/\

错误:规则“t_TkConjuncion”的正则表达式无效。不平衡括号

词法分析器将\\读取为\,因此它接受 t_TkDisjuncion,但我不明白为什么它不接受其他令牌。我一直在网上研究,但我一无所获。

关于为什么会发生这种情况的任何想法?

4

1 回答 1

1

我不知道,但我敢打赌有不止 1 级的反斜杠解释正在进行。Python 在编译字符串文字时肯定做了一个级别。您在示例中创建的实际字符串是

\/

/\

如果ply继续将它们嵌入到正则表达式中而不首先转义它们(这是我不知道的部分 - 但认为它很可能),那么第二个字符串中的尾随反斜杠将用于转义它后面的任何内容。这很可能是一个右括号,因此是一个“不平衡的括号”投诉。

无论如何,请尝试制作这些原始字符串:

t_TkDisjuncion = r'\\\/'
t_TkConjuncion = r'\/\\'

“r”前缀防止 Python 专门处理反斜杠,因此这些行创建的实际字符串是

\\\/

\/\\

如果然后将它们嵌入到正则表达式中而不首先转义它们(这取决于ply,而不是取决于您),它们将按照您的意图进行。

编辑我很确定就是这样。查看ply文档,确实使用正则表达式指定了标记,因此文档建议使用原始字符串(以避免我在上面谈到的反斜杠的双重解释)。

于 2013-11-10T03:32:14.423 回答