2012-02-18 4 views
2

Я новичок в Python и pyparsing, и я делаю оценщик логического выражения.Ошибка 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>) 

Мой код:

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

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

Что я делаю неправильно?

ответ

2

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

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

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

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

Смежные вопросы