2016-03-13 10 views
2

Синтаксис многих языков программирования требует, чтобы они были маркированы в соответствии с принципом "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 соблюдал принцип «максимального мэша»?

Если нет, существуют ли какие-либо указания относительно того, как следует указывать токены, чтобы избежать ситуаций с «меньшим, чем максимальным», например, выше?

ответ

1

PLY использует собственный пакет re Python для сопоставления токенов путем создания единого регулярного выражения в виде комбинации альтернатив. Поскольку библиотека регулярных выражений python не является максимальным, это не PLY.

Вместо матч выбран первый шаблон в этом большом регулярного выражения, которое соответствует, и порядку документирован в PLY nanual:

При создании регулярного выражения мастера, правила добавляются в следующем заказ:

  • Все лексемы, определенные функции добавляются в том же порядке, как они появляются в файле лексического анализатора.

  • Токены, определенные строками, добавляются затем путем сортировки их в порядке уменьшения длины регулярного выражения (добавляются более длинные выражения).

Так как шаблон, который соответствует = больше, он вставляется ранее и == может не совпадать.

Чтобы исправить это, сделайте шаблоны функциями, а затем закажите их по мере необходимости.