我正在python中使用ply构建词法分析器。我有2个令牌叫做TkConjuncion(指的是逻辑和)和TkDisjuncion(指的是逻辑和)。
两者的规则如下(其他规则也不相关):
t_TkDisjuncion = '\\\/'
t_TkConjuncion = '\/\\'
\\\/
为\/
且\/\\
为/\
。但是,当我测试我的代码时,它说:
错误:规则't_TkConjuncion'的正则表达式无效。 不平衡的括号
词法分析器将\\
读为\
,因此它接受t_TkDisjuncion,但我不明白为什么它不接受另一个令牌。我一直在网上研究,但我一无所获。
有关为何发生这种情况的任何想法?
答案 0 :(得分:1)
我不知道,但我下注正在进行超过1级的反斜杠解释。 Python在编译字符串文字时肯定会有一个级别。您在示例中创建的实际字符串是
\/
和
/\
如果ply
继续将它们嵌入到正则表达式而不首先转义它们(这是我不知道的部分 - 但是认为可能),那么第二个字符串中的尾部反斜杠将会起作用逃避任何跟随它的事情。这可能是一个正确的括号,因此是一个“不平衡的括号”投诉。
无论如何,请尝试改为使用这些原始字符串:
t_TkDisjuncion = r'\\\/'
t_TkConjuncion = r'\/\\'
“r”前缀阻止Python专门处理反斜杠,以便这些行创建的实际字符串是
\\\/
和
\/\\
如果然后将它们嵌入到正则表达式中而不首先转义它们(最多为ply
,而不是由你决定),它们就会按照你的意图进行。
编辑我很确定就是这样。查看ply
文档,令牌确实是使用正则表达式指定的,并且文档建议使用原始字符串,因为这样做(以避免我在上面谈到的反斜杠的双重解释)。