Я пытаюсь написать грамматику LEPL для описания булева языка поиска. Это то, что я до сих пор:
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
Последний parse
производит это:
[[('a', 'b'), ('c', 'd')], 'OR', 'e']
Он должен произвести это:
[[('a', 'b'), ('c', 'd'), 'e']]
Как я могу исправить это, чтобы получить анализ, который я хочу? Я думаю, это исправило бы это, если бы я мог сказать «все, что угодно» становится tuple
, а «все что угодно» становится list
.