Pyparsing生成带有组的二进制AST树

2024-09-27 07:19:22 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在为过程演算开发一个解析器。我已经开发了一个使用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;"                                                                                                                                                                  
]   

这将返回:

^{pr2}$

我的问题是关于第二个例子。我希望如此,我该怎么做呢

['P', '=', ['A', '.' [ 'B', '.', 'C' ]]]

Tags: 程序解析器过程astleftwordexprliteral
1条回答
网友
1楼 · 发布于 2024-09-27 07:19:22

expr中,您已将“.”运算符定义为左关联,但在所需的输出中,它是右关联的。更改:

expr = operatorPrecedence(operand,
    [(".", 2, opAssoc.LEFT),
     ("+", 2, opAssoc.LEFT),]
    )

^{pr2}$

现在这个代码:

for t in test:
    print expr_def.parseString(t).asList()

印刷品

['P', '=', ['A', '.', [['B', '.', 'C'], '+', ['E', '.', 'D']]]]
['P', '=', ['A', '.', ['B', '.', 'C']]]

相关问题 更多 >

    热门问题