Порядок сопоставления токенов в PLY

У меня есть парсер, написанный на PLY, который имеет следующее определение токена

def t_COMMAND(t):
    r'create|show'
    return t

def t_SCOPE(t):
    r'user|domain'
    return t

def t_STRING(t):
    r'[a-zA-Z_@\*\.]*'
    return t

Я пытаюсь разобрать следующую строку

show user where created_on = foo

Вот моя грамматика

S:COMMAND SCOPE FILTER;
FILTER:WHERE EXP |;
EXP:STRING OP STRING
...

Я получаю синтаксическую ошибку в токене created_on, вероятно, потому, что он сопоставляется как COMMAND, а не STRING

Есть ли способ заставить PLY взять максимально возможное совпадение?


ply
person rjv    schedule 23.07.2014    source источник


Ответы (1)


Нашел два возможных подхода

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

  • Если возможно, добавьте кавычки к STRING как '[a-zA-Z_@\*\.]*', чтобы его можно было отличить от COMMAND

Я выбрал второй подход, так как у меня много так называемых зарезервированных слов.

person rjv    schedule 25.07.2014
comment
Вы можете принять свой собственный ответ, чтобы показать, что проблема решена. - person Brian Tompsett - 汤莱恩; 10.05.2015