Я пытаюсь использовать зарезервированные слова в своей грамматике:
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. Как я могу обойти это? Я хотел бы, чтобы те два взяли более высокий приоритет, чем зарезервированные слова.
На ум приходят две вещи:
Поэтому я бы решил эту проблему следующим образом: Включите 'or' как зарезервированное слово и в t_ID проверьте, если длина строки равна 2 и если она состоит только из заглавных букв. Если это так, верните DEPT_CODE.