我是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^b
和aVb
。
解析器应该返回错误,但没有错误;相反,它返回a
。实际上,a
之后的任何符号都将被忽略。
这些表单的WFF版本为:(a^b)
和(aVb)
两者都正常工作。我认为问题出在原子定义中。
我做错了什么?
答案 0 :(得分:2)
默认情况下,parseString只会解析字符串的开头。
您可以通过将代码更改为:
来强制它解析整个字符串print fbf().parseString(entrada, parseAll=True)
或者,您可以使用StringEnd()标记结束语法 - 有关详细信息,请参阅http://packages.python.org/pyparsing/中parseString下的文档。