构建Python列表比较逻辑解析器

时间:2013-07-29 14:33:36

标签: python parsing

好吧,我正在尝试编写一个简单的解析器,给出以下内容:

d = {
    'a': [1,2,3,4],
    'b': [2,3,4,5],
    'c': [2,4,6,7]
}

以下两个功能:

def _and(l1, l2):
    return [i for i in l1 if i in l2]

def _or(l1, l2):
    return list(set(l1+l2))

我正在尝试接受一个字符串(例如"a||(b&c)")并将其解析为以下内容:

_or(d['a'],_and(d['b'],d['c']))

我之前从未写过解析器,所以我有点失落。解析器应支持ORAND和括号。有人能指出我正确的方向吗?如果有人知道,那么Python中的类似例子会很棒。

1 个答案:

答案 0 :(得分:2)

我将概述您应该如何考虑解决此问题。

您需要将输入字符串拆分为令牌,并将这些令牌的列表转换为syntax tree。在你的情况下,你应该有以下几点:

  • a
  • ||
  • (b&c)
    • b
    • &
    • c

您可能需要将相同的解析技术应用于括号b&c中的组件,以将其拆分为标记(如图所示)。因此,这个解析过程很可能是递归的,以便处理任意嵌套的括号。现有的工具可以为此提供帮助,例如ANTLR

从这里开始,您需要根据运算符优先级创建语法树。在这种情况下,您的表达式可以使用以下树来说明:

   OR
  /  \
 a   AND
     / \
    b   c

然后,您可以递归遍历此树,并根据其子节点执行每个节点的“操作”。显然,这比说明要容易。我采取的一种方法是创建一个Node类,其实例用于构成树。每个Node都可以使用evaluate方法返回其结果。对于叶abc,结果只是d['a']d['b']d['c']。对于ORAND,结果基于您定义的函数_and_or