好吧,我正在尝试编写一个简单的解析器,给出以下内容:
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']))
我之前从未写过解析器,所以我有点失落。解析器应支持OR
,AND
和括号。有人能指出我正确的方向吗?如果有人知道,那么Python中的类似例子会很棒。
答案 0 :(得分:2)
我将概述您应该如何考虑解决此问题。
您需要将输入字符串拆分为令牌,并将这些令牌的列表转换为syntax tree。在你的情况下,你应该有以下几点:
a
||
(b&c)
b
&
c
您可能需要将相同的解析技术应用于括号b&c
中的组件,以将其拆分为标记(如图所示)。因此,这个解析过程很可能是递归的,以便处理任意嵌套的括号。现有的工具可以为此提供帮助,例如ANTLR。
从这里开始,您需要根据运算符优先级创建语法树。在这种情况下,您的表达式可以使用以下树来说明:
OR / \ a AND / \ b c
然后,您可以递归遍历此树,并根据其子节点执行每个节点的“操作”。显然,这比说明要容易。我采取的一种方法是创建一个Node
类,其实例用于构成树。每个Node
都可以使用evaluate
方法返回其结果。对于叶a
,b
和c
,结果只是d['a']
,d['b']
和d['c']
。对于OR
和AND
,结果基于您定义的函数_and
和_or
。