2012-10-30 110 views
1

嗨,我正在開發一個進程演算分析器。我已經開發了一個使用setParseAction和自定義AST類,但現在我想重寫它使用字典和列表。Pyparsing生成組與二進制AST樹

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' ]]] 

回答

2

expr你已經定義了'。'算子是左聯想的,但是在你想要的輸出中,它是右聯想的。更改:

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

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

下面這段代碼:

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

打印

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

有可能添加的非關聯選項pyparsing?在大多數抽象代數中可能發生這樣的事情。 – Darek