Python 使用组生成二叉AST树
嗨,我正在为过程演算开发一个解析器。我已经开发了一个使用Python 使用组生成二叉AST树,python,parsing,pyparsing,Python,Parsing,Pyparsing,嗨,我正在为过程演算开发一个解析器。我已经开发了一个使用setParseAction和自定义AST类的类,但是现在我想重写它,使用dicts和list from pyparsing import *
setParseAction
和自定义AST类的类,但是现在我想重写它,使用dicts和list
from pyparsing import *
integer = Word(nums).setParseAction(lambda t:int(t[0]))
variable = Word(alphas,exact=1)
operand = Word(alphas.upper(), alphanums+"_")
semicol = Literal(";").suppress()
equals = Literal("=")
expr = operatorPrecedence( operand,
[(".", 2, opAssoc.LEFT),
("+", 2, opAssoc.LEFT),]
)
rmdef = operand + equals + expr
expr_def = rmdef + semicol
test = ["P = A.(B.C + E.D);",
"P = A.B.C;"
]
这将返回:
['P', '=', ['A', '.', [['B', '.', 'C'], '+', ['E', '.', 'D']]]]
['P', '=', ['A', '.', 'B', '.', 'C']]
我的问题是关于第二个例子。我希望是这样,我该怎么做呢
['P', '=', ['A', '.' [ 'B', '.', 'C' ]]]
在
expr
中,您已将“.”运算符定义为左关联,但在所需的输出中,它是右关联的。更改:
expr = operatorPrecedence(operand,
[(".", 2, opAssoc.LEFT),
("+", 2, opAssoc.LEFT),]
)
到
现在这个代码:
for t in test:
print expr_def.parseString(t).asList()
印刷品
['P', '=', ['A', '.', [['B', '.', 'C'], '+', ['E', '.', 'D']]]]
['P', '=', ['A', '.', ['B', '.', 'C']]]
是否有可能将非关联选项添加到pyparsing?在大多数抽象代数中,这样的事情都可能发生。
['P', '=', ['A', '.', [['B', '.', 'C'], '+', ['E', '.', 'D']]]]
['P', '=', ['A', '.', ['B', '.', 'C']]]