2017-11-16 11 views
2

私は基本的なコンピュータ命令の行を解析するコードを書いています。私の入力文字列は、この予想より多くの一致が見つかった場合

のようなものであるとのように私は結果を期待している:私の実際の結果は、しかしラインと命令パーサは思え、私が探しているものの一般的な構造を持っている

<line> 
    <instruction> 
    <type>ADD</type> 
    <args> 
     <ITEM>input1</ITEM> 
     <ITEM>input2</ITEM> 
    </args> 
    </instruction> 
    <instruction> 
    <type>DEL</type> 
    <args> 
     <ITEM>input3</ITEM> 
    </args> 
    </instruction> 
</line> 
<line> 
    <instruction> 
    <type>SUB</type> 
    <args> 
     <ITEM>input1</ITEM> 
     <ITEM>input2</ITEM> 
    </args> 
    </instruction> 
    <instruction> 
    <type>INS</type> 
    <args> 
     <ITEM>input3</ITEM> 
    </args> 
    </instruction> 
</line> 

間違った場所で一致するか、ラベルが間違った場所に表示されている可能性があります。

実績:

<line> 
    <line> 
    <instruction> 
     <type>ADD</type> 
     <args> 
     <ITEM>input1</ITEM> 
     <ITEM>input2</ITEM> 
     </args> 
    </instruction> 
    <instruction> 
     <type>DEL</type> 
     <args> 
     <ITEM>input3</ITEM> 
     </args> 
    </instruction> 
    </line> 
    <instruction> 
    <instruction> 
     <type>SUB</type> 
     <args> 
     <ITEM>input1</ITEM> 
     <ITEM>input2</ITEM> 
     </args> 
    </instruction> 
    <instruction> 
     <type>INS</type> 
     <args> 
     <ITEM>input3</ITEM> 
     </args> 
    </instruction> 
    </instruction> 
</line> 

何らかの理由の結果

[[['OTE', ['output1']]], [['XIO', ['input2']], ['OTE', ['output2']]]] 
- branch: [[['OTE', ['output1']]], [['XIO', ['input2']], ['OTE', ['output2']]]] 
    [0]: 
    [['OTE', ['output1']]] 
    - instruction: ['OTE', ['output1']] 
     - args: ['output1'] 
     - type: 'OTE' 
    [1]: 
    [['XIO', ['input2']], ['OTE', ['output2']]] 
    - instruction: ['OTE', ['output2']] 
     - args: ['output2'] 
     - type: 'OTE' 

のダンプ、ライン全体構造上にマッチングされ、命令の2行目は、単一の命令としてマッチングされグループ。私はinstruction行で.setDebug()関数を使用しようとしましたが、出力の解釈方法がわかりません。私は最後のがWord(Word)パターンに従わないため、命令と一致する必要があるのはなぜですか?

マイコード:

#!python3 
from pyparsing import nestedExpr,alphas,Word,Literal,OneOrMore,alphanums,delimitedList,Group,Forward 

theInput = r"ADD(input1,input2) DEL(input3), SUB(input1,input2) INS(input3)" 

instructionType = Word(alphanums+"_")("type") 
argument = Word(alphanums+"_[].") 
arguments = Group(delimitedList(argument))("args") 
instruction = Group(instructionType + Literal("(").suppress() + arguments + Literal(")").suppress())("instruction") 

line = (delimitedList(Group(OneOrMore(instruction))))("line") 

parsedInput = line.parseString(theInput).asXML() 
print(parsedInput) 

デバッグ出力:

Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 0(1,1) 
Matched Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) -> [['ADD', ['input1', 'input2']]] 
Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 18(1,19) 
Matched Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) -> [['DEL', ['input3']]] 
Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 30(1,31) 
Exception raised:Expected W:(ABCD...) (at char 30), (line:1, col:31) 
Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 32(1,33) 
Matched Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) -> [['SUB', ['input1', 'input2']]] 
Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 50(1,51) 
Matched Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) -> [['INS', ['input3']]] 
Match Group:({W:(ABCD...) Suppress:("(") Group:(W:(ABCD...) [, W:(ABCD...)]...) Suppress:(")")}) at loc 62(1,63) 
Exception raised:Expected W:(ABCD...) (at char 62), (line:1, col:63) 

私が間違って何をしているのですか?

+0

'asXML'を使って結果を出力するのではなく、' dump'を使ってください。 – PaulMcG

+0

@PaulMcG助けてくれてありがとう!元の質問にダンプを追加しました。 – Seth

+0

:)あなたは 'print(line.parseString(theInput))しました。dump) '、あなたは' print(line.parseString(theInput).dump()) 'を実行する必要があります。 – PaulMcG

答えて

0

は、コードのためのあなたのダンプ出力は次のようなルックスを投稿:

ADD(input1,input2) DEL(input3), SUB(input1,input2) INS(input3) 

[[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
- line: [[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
    [0]: 
    [['ADD', ['input1', 'input2']], ['DEL', ['input3']]] 
    - instruction: ['DEL', ['input3']] 
     - args: ['input3'] 
     - type: 'DEL' 
    [1]: 
    [['SUB', ['input1', 'input2']], ['INS', ['input3']]] 
    - instruction: ['INS', ['input3']] 
     - args: ['input3'] 
     - type: 'INS' 

我々は、すべての命令が解析されるダンプ()出力で見ることができますが、唯一の各グループの最後の命令が下に現れます"命令"の名前。これは、Pythonのように、複数の値(ZeroOrMoreまたはOneOrMoreに入るかもしれない)が同じキーで割り当てられると、最後の値だけが保持されるためです。

2つの解決策があります。複数の値が与えられた名前のために保存しなければならないときpyparsingで倍もあります

[[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
- line: [[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
    [0]: 
    [['ADD', ['input1', 'input2']], ['DEL', ['input3']]] 
    [0]: 
     ['ADD', ['input1', 'input2']] 
     - args: ['input1', 'input2'] 
     - type: 'ADD' 
    [1]: 
     ['DEL', ['input3']] 
     - args: ['input3'] 
     - type: 'DEL' 
    [1]: 
    [['SUB', ['input1', 'input2']], ['INS', ['input3']]] 
    [0]: 
     ['SUB', ['input1', 'input2']] 
     - args: ['input1', 'input2'] 
     - type: 'SUB' 
    [1]: 
     ['INS', ['input3']] 
     - args: ['input3'] 
     - type: 'INS' 

:あなただけの各サブリストに解析された命令を取得するように、一つは(「命令」)結果の名前を削除することです。 setResultsName()メソッドには、この動作を有効にするオプションの引数listAllMatchesがあります。 setResultsNameのための呼び出し可能なショートカットを使用するときは、listAllMatches=Trueを渡すことはできません - 代わりに、「*」を使用して結果の名を終了します。

instruction = Group(instructionType 
           + Literal("(").suppress() 
           + arguments 
           + Literal(")").suppress())("instruction*") 

この出力を与える:

[[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
- line: [[['ADD', ['input1', 'input2']], ['DEL', ['input3']]], [['SUB', ['input1', 'input2']], ['INS', ['input3']]]] 
    [0]: 
    [['ADD', ['input1', 'input2']], ['DEL', ['input3']]] 
    - instruction: [['ADD', ['input1', 'input2']], ['DEL', ['input3']]] 
     [0]: 
     ['ADD', ['input1', 'input2']] 
     - args: ['input1', 'input2'] 
     - type: 'ADD' 
     [1]: 
     ['DEL', ['input3']] 
     - args: ['input3'] 
     - type: 'DEL' 
    [1]: 
    [['SUB', ['input1', 'input2']], ['INS', ['input3']]] 
    - instruction: [['SUB', ['input1', 'input2']], ['INS', ['input3']]] 
     [0]: 
     ['SUB', ['input1', 'input2']] 
     - args: ['input1', 'input2'] 
     - type: 'SUB' 
     [1]: 
     ['INS', ['input3']] 
     - args: ['input3'] 
     - type: 'INS' 

あなたはどのアプローチを選択することができますあなたはより快適です。

関連する問題