Синтаксис многих языков программирования требует, чтобы они были маркированы в соответствии с принципом "maximal munch". То есть эти жетоны должны быть построены из максимально возможного количества символов из входного потока.Поддерживает ли lexer PLY «максимальный жеватель»?
PLUS lexer, похоже, не применяет этот принцип. Например:
import ply.lex as lex
tokens = ('ASSIGNMENT', 'EQUALITY')
t_ASSIGNMENT = r'[+\-*/]?='
t_EQUALITY = r'=='
lexer = lex.lex()
lexer.input('==')
for tok in lexer:
print(tok)
В соответствии с «максимальной Мунка», выход этого кода должен быть LexToken(EQUALITY,'==',1,0)
, но это LexToken(ASSIGNMENT,'=',1,0) LexToken(ASSIGNMENT,'=',1,1)
. Это похоже на то, что лексер предпочитает ASSIGNMENT
над EQUALITY
- приоритет более длинного регулярного выражения, а не более длинного совпадения.
Возможно ли, чтобы лексер PLY соблюдал принцип «максимального мэша»?
Если нет, существуют ли какие-либо указания относительно того, как следует указывать токены, чтобы избежать ситуаций с «меньшим, чем максимальным», например, выше?