Ошибка разбора при вычислении логических выражений WFF? - PullRequest
2 голосов
/ 19 февраля 2012

Я новичок в Python и pyparsing, и я делаю оценку логических выражений.

Формула должна быть WFF . BNF WFF:

<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>)

Мой код:

'''
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^b и aVb.

Парсер должен вернуть ошибку, но ошибки нет; вместо этого он возвращает a. На самом деле, любой символ после a будет игнорироваться.

WFF-версия этих форм: (a^b) и (aVb)

Оба работают правильно. Я думаю, что проблема в определении атома.

Что я делаю не так?

1 Ответ

2 голосов
/ 20 февраля 2012

По умолчанию parseString будет просто анализировать начало строки.

Вы можете принудительно проанализировать всю строку, изменив код на:

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

В качестве альтернативы, вы можете завершитьграмматика с маркером StringEnd () - для получения более подробной информации см. документацию по parseString в http://packages.python.org/pyparsing/.

...