如何将摩根定律应用于解析字符串?(转换字符串或使用parseactions)

2024-09-27 21:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图做一个程序,评估一个命题逻辑公式是有效还是无效使用语义三方法。在

到目前为止,我设法评估了一个公式是否正确:

from pyparsing import *
from string import lowercase

def fbf():

    atom = Word(lowercase, max=1) #alfabeto minusculas
    op = oneOf('^ V => <=>') #Operadores
    identOp = oneOf('( [ {')
    identCl = oneOf(') ] }')
    form = Forward() #Iniciar de manera recursiva
    #Gramatica
    form << ( (Group(Literal('~') + form)) | ( Group(identOp + form + op + form + identCl) ) | ( Group(identOp + form + identCl) ) | (atom) )

    return form

#Haciendo todo lo que se debe
entrada = raw_input("Entrada: ")
try:
    print fbf().parseString(entrada, parseAll=True)
except ParseException as error: #Manejando error
    print error.markInputline()
    print error
print

现在我需要把被否定的forumla~(form)转换成Monrgan定律,Morgan定律的BNF是这样的:

^{pr2}$

http://en.wikipedia.org/wiki/De_Morgans_laws

解析必须是递归的;我读过关于Parseactions的文章,但我并不真正理解我是python新手,而且非常不熟练。在

有人能帮我把这个弄起来吗?在


Tags: fromimportformgrouperror公式atomprint
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:52

胡安·何塞-

无论你意识到与否,你都在要求听众做大量的工作。以下是关于如何在这个问题上取得进展的一些建议:

  • 认识到解析输入只是整个程序的第一步。您不能只编写任何解析器,通过输入,然后声明自己准备好下一步。您需要预测将如何处理已解析的输出,并尝试以这样的方式解析数据,以便为下一步做好准备—在您的案例中,这是进行一些逻辑转换以应用DeMorgans定律。事实上,向后工作可能是最好的——假设你有一个解析器,你需要你的转换代码来处理什么,一个表达式看起来如何,你将如何执行转换本身?这将很自然地将您的思想结构到应用程序域,并在您开始编写解析器时为您提供一个目标结果格式。

  • 当您开始编写解析器时,请查看其他执行类似任务的pyparsing示例,例如SimpleBool.py在pyparsing wiki上。了解它们如何解析输入以创建一组可评估对象,然后在应用程序域中对这些对象执行操作(无论是对它们求值、转换还是其他操作)。考虑一下您希望在解析器中创建哪种类型的对象,这些对象将使用上一步中概述的转换方法。

  • 花点时间为要解析的语法编写一个BNF。写出一些示例测试字符串,您将分析这些字符串以帮助您预测语法问题。“~~p^q V r”是有效字符串吗?标识符可以是多个字符,还是只限于单个字符(一开始使用单个字符比较容易,以后可以轻松扩展)?如果可以的话,保持语法简单,比如只支持()的分组,而不是任何匹配的()、[]或{}对。

  • 实现解析器时,首先从简单的测试用例开始,然后逐步向上。如果您发现在早期就做出了一些更复杂的字符串不支持的假设,那么您可能需要回溯一点,但这对于大多数编程项目来说是非常典型的。

  • 作为实现技巧,请仔细阅读operatorreception助手的使用,因为它是专门为这些类型的解析作业设计的。看看它是怎么用在SimpleBool.py创建镜像输入字符串结构的对象层次结构。然后想想对象在转换过程中会做什么。

祝你好运!在

相关问题 更多 >

    热门问题