【问题标题】:Implementing logic from text从文本实现逻辑
【发布时间】:2011-09-19 19:53:38
【问题描述】:

我有一个程序以文本形式接收输入,例如:

IF (A.4.1-1/1 OR A.4.1-1/2) AND A.4.4-1/9 AND (A.4.4-1/12 OR A.4.4-1/13 OR A.4.4-1/14 OR A.4.4-1/15) THEN R ELSE N/A

其中A.4.1-1/1 等是具有值TRUE or FALSE 的变量。到目前为止,我已经将文本解析为上述示例的逻辑部分,我有一个如下所示的列表:

['IF', '(', 'A.4.1-1/1', 'OR', 'A.4.1-1/2', ')', 'AND', 'A.4.4-1/9', 'AND', '(', 'A.4.4-1/12', 'OR', 'A.4.4-1/13', 'OR', 'A.4.4-1/14', 'OR', 'A.4.4-1/15', ')', 'THEN', 'R', 'ELSE', 'N/A']

我只是想知道是否可以实际执行此列表上的逻辑,例如将所有这些组合到所需的 python 语句中并提供结果。我不确定是否要开始我在一些网站上阅读过我应该使用自上而下的解析器??

【问题讨论】:

标签: python parsing logic


【解决方案1】:

这听起来像是Pyparsing 的任务:

pyparsing 模块是一个替代方案 创建和执行的方法 简单的语法,与传统的 lex/yacc 方法,或使用 常用表达。解析 模块提供了一个类库 客户端代码用来构造 直接在 Python 代码中语法。

您将能够快速定义语法(而不是使用正则表达式)和特定的解析操作。我使用 Pyparsing 用不到 300 行代码构建了非常丰富的迷你语言。

【讨论】:

  • pyparsing wiki 示例页面中的 SimpleBool.py 示例可能非常适合。
  • @Paul:我猜你知道,因为你写了 Pyparsing ;)
【解决方案2】:

我不是 Python 人,但我使用 JavaCC 在 Java 中做过类似的事情。你要做的是为你的语言编写一个grammar(格式如EBNF,但它取决于解析器生成器),然后使用JavaCC之类的程序为其生成解析器,这将给你一个parse tree,操作起来更方便。

您应该能够找到许多有用的示例,因为您输入的语法看起来并不太不寻常(布尔运算符、带括号的表达式和 if-then-else 语句可能是一些最常见的用例这个)。

您可能会发现其中一个 Python 库 listed on this page 很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多