Лексический анализатор Python/YACC: Маркерный приоритет?

Я пытаюсь использовать зарезервированные слова в своей грамматике:

reserved = {
   'if' : 'IF',
   'then' : 'THEN',
   'else' : 'ELSE',
   'while' : 'WHILE',
}

tokens = [
 'DEPT_CODE',
 'COURSE_NUMBER',
 'OR_CONJ',
 'ID',
] + list(reserved.values())

t_DEPT_CODE = r'[A-Z]{2,}'
t_COURSE_NUMBER  = r'[0-9]{4}'
t_OR_CONJ = r'or'

t_ignore = ' \t'

def t_ID(t):
 r'[a-zA-Z_][a-zA-Z_0-9]*'
 if t.value in reserved.values():
  t.type = reserved[t.value]
  return t
 return None

Однако правило t_ID так или иначе проглатывает DEPT_CODE и OR_CONJ. Как я могу обойти это? Я хотел бы, чтобы те два взяли более высокий приоритет, чем зарезервированные слова.

12
задан Nick Heiner 26 May 2010 в 05:45
поделиться

1 ответ

На ум приходят две вещи:

  • очевидно, что 'or' - это зарезервированное слово, как 'if', 'then' и т.д.
  • ваш RE для t_ID соответствует супернабору строк, которые соответствуют DEPT_CODE.

Поэтому я бы решил эту проблему следующим образом: Включите 'or' как зарезервированное слово и в t_ID проверьте, если длина строки равна 2 и если она состоит только из заглавных букв. Если это так, верните DEPT_CODE.

0
ответ дан 2 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: