2012-02-18 3 views
2

저는 파이썬과 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을 아래의 설명서를 참조하십시오 .