我试图弄清楚如何做一个左关联表达式,其中递归(不包含在任何东西)表达式是可能的.例如,我想做:
expr + OP + expr
Run Code Online (Sandbox Code Playgroud)
它分析2个操作,如1 x 2 x 3
入(expr OP expr) OP expr
结果.
如果我试图阻止expr
无限递归解析,我可以做类似的事情:
expr -> Group(simple_expr + OP + expr)
| simple_expr
Run Code Online (Sandbox Code Playgroud)
但后来我得到了expr OP (expr OR expr)
结果.
如何强制左侧绑定?
编辑:我知道operatorPrecedence
但是当操作员"IS" + Optional("NOT")
或类似时,它似乎没有正确匹配.
我想解析逻辑字符串并获得"和"逻辑中所有元素的组合.例如,对于字符串'(A和(B或C))'我应该得到[[A,B],[A,C]]和字符串'(A和B以及(C或D和F)或者F和G)'我应该[[A,B,C],[A,B,D,F],[F,G]].
我正在尝试使用pyparsing.在这篇文章之后,在这里以二叉树方式解析pyparsing中的复杂逻辑表达式,我设法得到一个嵌套列表,其中字母按照首选项分组("和"优先于"或",括号覆盖此):
import pyparsing as pp
complex_expr = pp.Forward()
vars = pp.Word(pp.alphas, pp.alphanums + "_") | pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?").setName('proteins')
clause = pp.Group(vars ^ (pp.Suppress("(") + complex_expr + pp.Suppress(")") ))
expr = pp.operatorPrecedence(clause,[
("and", 2, pp.opAssoc.LEFT, ),
("or", 2, pp.opAssoc.LEFT, ),])
#print expr
complex_expr << expr
parseresult=complex_expr.parseString('( A and B and ( C or D and F ) or F and G )')
print parseresult
Run Code Online (Sandbox Code Playgroud)
这使:
[[[['A'],'和',['B'],'和',[[['C'],'或',[['D'],'和',['F ']]]]],'或',[['F'],'和',['G']]]]]
现在我该如何处理这个结果来实现所需的输出?我会很乐意帮助你.我试过pyparsing但我对其他可能更好的模块开放.
提前致谢.