Я использую SLY с Python для анализа текста с относительно простой грамматикой.Строки, которые я хотел бы проанализировать, содержат имена сигналов определенной системы, объединенные с помощью операторов AND или OR.То есть что-то вроде "(SIG1 OR SIG2 OR SIG3 OR SIG4 OR SIG5) AND SIG6"
.
. Одна из характеристик данных состоит в том, что в них будут доминировать длинные списки сигналов ИЛИ, объединенные вместе.Парсер, который я создал до сих пор (см. Ниже), воспринимает только операторы OR или AND как двоичные и выводит вложенный кортеж, как показано ниже: ('AND', ('OR', ('OR', ('OR', ('OR', 'SIG1', 'SIG2'), 'SIG3'), 'SIG4'), 'SIG5'), 'SIG6')
Учитывая список операторов OR, объединенных вместе,было бы неплохо объединить их в операторах ИЛИ произвольной длины: ('AND', ('OR', 'SIG1', 'SIG2', 'SIG3', 'SIG4', 'SIG5'), 'SIG6')
Я думаю, мне нужно отредактировать парсер, но я не могу думать как, и буду признателен за любые указатели, которые вы можете мне дать.
class BoolLexer(Lexer):
tokens = { ID, LPAREN, RPAREN, AND, OR }
ignore = ' \t\n'
ID = r'[a-zA-Z_\.][a-zA-Z0-9_\.]*'
LPAREN = r'\('
RPAREN = r'\)'
ID['AND'] = AND
ID['OR'] = OR
class BoolParser(Parser):
tokens = BoolLexer.tokens
@_('expr AND term')
def expr(self, p):
return ('AND', p.expr, p.term)
@_('expr OR term')
def expr(self, p):
return ('OR', p.expr, p.term)
@_('term')
def expr(self, p):
return p.term
@_('ID')
def term(self, p):
return p.ID
@_('LPAREN expr RPAREN')
def term(self, p):
return p.expr