评估WFF逻辑表达式时出现Pyparsing错误?

时间:2012-02-18 23:17:55

标签: python recursion pyparsing

我是Python和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^baVb

解析器应该返回错误,但没有错误;相反,它返回a。实际上,a之后的任何符号都将被忽略。

这些表单的WFF版本为:(a^b)(aVb)

两者都正常工作。我认为问题出在原子定义中。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

默认情况下,parseString只会解析字符串的开头。

您可以通过将代码更改为:

来强制它解析整个字符串
print fbf().parseString(entrada, parseAll=True)

或者,您可以使用StringEnd()标记结束语法 - 有关详细信息,请参阅http://packages.python.org/pyparsing/中parseString下的文档。