2012-02-18 7 views
2

私はPythonとpyparsingが新しく、論理式評価ツールを作っています。WFF論理式を評価する際のPyparsingエラー?

数式はWFFである必要があります。 WFFのBNFは次のとおりです。

<alpha set> ::= p | q | r | s | t | u | ... 
(the arbitrary finite set of propositional variables) 

<form> ::= <alpha set> | ¬<form> | (<form>V<form>) | (<form>^<form>) 
      | (<form> -> <form>) | (<form> <-> <form>) 

私のコードは次のとおりです。a^baVb:私はこれらの表現を使用する場合

''' 
Created on 17/02/2012 

@author: Juanjo 

''' 

from pyparsing import * 
from string import lowercase 

def fbf(): 
    atom = Word(lowercase, max=1) #aphabet 
    op = oneOf('^ V => <=>') #Operators 
    identOp = oneOf('([ {') 
    identCl = oneOf(') ] }') 
    form = Forward() #Iniciar de manera recursiva 
    #Grammar: 
    form << ((Group(Literal('~') + form)) | (Group(identOp + form + op + form + identCl)) | (Group(identOp + form + identCl)) | (atom)) 

    return form 

entrada = raw_input("Input please: ") #userinput 
print fbf().parseString(entrada) 

問題があります。

パーサーはエラーを返しますが、エラーはありません。代わりにaを返します。実際には、aの後のシンボルは無視されます。

それらのフォームのWFFのバージョンは以下のとおりです。(a^b)

両方の仕事を正しく(aVb)。私は問題が原子の定義にあると思う。

私は間違っていますか?

答えて

2

デフォルトでは、parseStringは文字列の先頭を解析します。

あなたがにコードを変更することにより、文字列全体を解析するためにそれを強制することができます:あなたは)(StringEndでトークンを文法を終了することができ、また

print fbf().parseString(entrada, parseAll=True) 

- 詳細はhttp://packages.python.org/pyparsing/にparseString下のマニュアルを参照してください。