Python 如何应用Morgan';解析字符串有什么规律?(转换字符串或使用parseactions)

Python 如何应用Morgan';解析字符串有什么规律?(转换字符串或使用parseactions),python,logic,pyparsing,demorgans-law,Python,Logic,Pyparsing,Demorgans Law,我正在尝试做一个程序,用语义三方法来评估命题逻辑公式是有效的还是无效的 我设法评估了公式的格式是否正确: from pyparsing import * from string import lowercase def fbf(): atom = Word(lowercase, max=1) #alfabeto minusculas op = oneOf('^ V => <=>') #Operadores identOp = oneOf('( [ {

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

我设法评估了公式的格式是否正确:

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

解析必须是递归的;我读过关于Parseactions的文章,但我不太明白我是python新手,而且非常不熟练

有人能帮我把这件事做好吗?

Juan Jose-

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

  • 认识到解析输入只是整个程序的第一步。您不能只编写任何通过输入的解析器,然后声明您已经为下一步做好了准备。您需要预测您将对解析的输出执行什么操作,并尝试以这样的方式解析数据,以便为下一步做好准备—在您的情况下,这是执行一些逻辑转换以应用DeMorgans定律。事实上,最好是反向工作——假设您有一个解析器,您需要转换代码使用什么,表达式的外观如何,以及如何执行转换本身?这将自然地将您的思维组织到应用程序域,并在您开始编写解析器时为您提供目标结果格式

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

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

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

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

祝你好运

胡安·何塞-

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

  • 认识到解析输入只是整个程序的第一步。您不能只编写任何通过输入的解析器,然后声明您已经为下一步做好了准备。您需要预测您将对解析的输出执行什么操作,并尝试以这样的方式解析数据,以便为下一步做好准备—在您的情况下,这是执行一些逻辑转换以应用DeMorgans定律。事实上,最好是反向工作——假设您有一个解析器,您需要转换代码使用什么,表达式的外观如何,以及如何执行转换本身?这将自然地将您的思维组织到应用程序域,并在您开始编写解析器时为您提供目标结果格式

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

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

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

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

祝你好运

~((form) V (form)) = (~(form) ^ ~(form))
~((form) ^ (form)) = (~(form) V ~(form))