1

こんにちは私はプロセス計算用のパーサーを開発しています。カスタムASTクラスを使用するものをすでに開発しsetParseActionましたが、今度はdictと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']]

私の質問は2番目の例に関するものです。どうすればいいの?

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

1 に答える 1

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']]]
于 2012-10-30T13:20:42.650 に答える