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

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

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

我做错了什么?

最佳答案

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

您可以通过将代码更改为来强制它解析整个字符串:

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

或者,您可以使用 StringEnd() 标记结束语法 - 请参阅 http://packages.python.org/pyparsing/ 中 parseString 下的文档。了解更多详情。

关于python - 评估 WFF 逻辑表达式时出现 Pyparsing 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345069/

相关文章:

java - 如何使用 Java 递归打印(但不返回)字符串?

python - 在 Python 中用于下载 NCBI 文件的多线程

python - 如果路径是文件或目录 (Python)

Python嵌套列表递归搜索

java - 扫雷递归,stackoverflow

python - Pyparsing - 从数字到列表的简单解析

python - 类型错误 : expected a character buffer object

python - 子类化 int 以获得十六进制表示

python - Pyparsing packrat会降低性能

python - pyparsing:是否可以将 lineno/col (或 startloc/endloc)添加到所有标记中?