Python 使用LEPL解析布尔搜索查询

Python 使用LEPL解析布尔搜索查询,python,parsing,boolean,grammar,lepl,Python,Parsing,Boolean,Grammar,Lepl,我试图写一个语法来描述布尔搜索语言。这就是我到目前为止所做的: from lepl import * text = String() | Word() tail = ~Lookahead('AND') & ~Lookahead('OR') & text with DroppedSpace(): andClause = (tail & Lookahead('AND') & Drop('AND') & tail)[1:] > tuple

我试图写一个语法来描述布尔搜索语言。这就是我到目前为止所做的:

from lepl import *
text = String() | Word()
tail = ~Lookahead('AND') & ~Lookahead('OR') & text
with DroppedSpace():
    andClause = (tail & Lookahead('AND') & Drop('AND') & tail)[1:] > tuple
    orClause = (tail & Lookahead('OR') & Drop('OR') & tail)[1:] > list
    andOrText = (andClause & Lookahead('OR') & Drop('OR') & tail)[1:] > list
    orAndText = (orClause & Lookahead('AND') & Drop('AND') & tail)[1:] > tuple
    oredAnds = (andClause & Lookahead('OR') & Drop('OR') & andClause)[1:] > list
    andedOrs = (orClause & Lookahead('AND') & Drop('AND') & orClause)[1:] > tuple
    query = (oredAnds | andedOrs | orAndText | andOrText | orClause | andClause | text)[:]

query.parse('foo AND bar') # Works
query.parse('"bar none" OR foo') # Works
query.parse('foo AND "bar none" OR baz AND floo') # Works
query.parse('a AND b OR c AND d OR e') # Doesn't work
最后一次
分析产生以下结果:

[[('a', 'b'), ('c', 'd')], 'OR', 'e']
它应产生以下结果:

[[('a', 'b'), ('c', 'd'), 'e']]

如何修复此问题以获得所需的解析?我想如果我能说“which AND which”变成一个
元组,而“which OR which”变成一个
列表,
编辑:由于添加了关键字参数,摆脱了slooooow-left递归,它就会解决这个问题

from lepl import *
def ander(result):
    if len(result) == 2:
        return (result[0], result[1])
    return result[0]
text = String() | Word()
andClausePrime = Delayed()
label = text & Drop(':')
with DroppedSpace():
    parameter = label & text > (lambda r: {r[0]: r[1]})
    andClause = (parameter | text) & andClausePrime > ander
    andClausePrime += (Drop('AND') & (andClause | parameter | text) & andClausePrime)[:]
    expr = andClause | parameter | text
    query = expr & (Drop('OR') & expr)[:]
结果是:

>>> query.parse('a AND b')
[('a', 'b')]
>>> query.parse('a AND b AND c')
[('a', ('b', 'c'))]
>>> query.parse('a AND b AND c AND d')
[('a', ('b', ('c', 'd')))]
>>> query.parse('a AND b AND c AND d OR e AND f')
[('a', ('b', ('c', 'd'))), ('e', 'f')]
>>> query.parse('a AND b AND c AND d OR e OR f')
[('a', ('b', ('c', 'd'))), 'e', 'f']
>>> query.parse('foo AND bar')
[('foo', 'bar')]
>>> query.parse('"bar none" OR foo')
['bar none', 'foo']
>>> query.parse('key:value AND "hey now":5 OR "what is":up')
[({'key': 'value'}, {'hey now': '5'}), {'what is': 'up'}]

我想这可能是我需要的。尝试一下……有没有办法让它同时解析
而不是
表达式?