Для анализатора, который я создаю, я использую это регулярное выражение в качестве определения идентификатора:
ID: /[a-z_][a-z0-9]*/i
(Для тех, кто не знаком с синтаксисом конкретного анализатора, который я использую, флаг "i" просто означает без учета регистра).
У меня также есть несколько ключевых слов, например:
CALL_KW: "call"
PRINT_KW: "print"
Проблема в том, что из-за некоторых неясностей в грамматике иногда ключевые слова обрабатываются как идентификаторы, хотя я действительно не хочу, чтобы они были. Поэтому я подумал, можно ли переписать регулярное выражение для идентификатора таким образом, чтобы ключевые слова вообще не сопоставлялись с ним. Возможна ли такая вещь?
Чтобы получить больше контекста, я использую библиотеку синтаксического анализатора Lark для Python. Парсер Earley, который обеспечивает Lark (вместе с динамическим лексером), достаточно гибок и силен в обработке неоднозначных грамматик, но иногда они делают странные вещи, подобные этой (и недетерминированно, в этом!). Поэтому я пытаюсь помочь парсеру, сделав ключевые слова никогда не совпадающими с правилом идентификатора.