Токен с различными интерпретациями (т.е. ключевое слово и идентификатор) - PullRequest
0 голосов
/ 11 июня 2018

Я пишу грамматику с большим количеством нечувствительных к регистру ключевых слов в ANTLR4.Я собрал несколько файлов примеров для этого формата, которые я пытаюсь протестировать, и некоторые используют те же токены, которые существуют в качестве ключевых слов в качестве идентификаторов в других местах.Например, есть ключевое слово CORE, которое в других местах используется как ID для структуры из пользовательского ввода.Вот некоторые части моей грамматики:

fragment A : [aA]; // match either an 'a' or 'A'
fragment B : [bB];
fragment C : [cC];
[...]
CORE:        C O R E ;
[...]
IDSTRING:    [a-zA-Z_] [a-zA-Z0-9_]*;
id:          IDSTRING ;

В этом случае выдается ошибка line 7982:8 mismatched input 'core' expecting IDSTRING, поскольку пользовательский ввод задан как IDSTRING, но всегда используется правилом ключевого слова.Во входных данных он существует как ключевое слово и как идентификатор:

MACRO oa12f01
    CLASS CORE ; #here it is a KEYWORD
[...]
SITE core ; #here it is a ID

Есть ли способ, позволяющий пользователям использовать некоторые ключевые слова в качестве идентификаторов, меняя мою грамматику, например, «приведение» токена к IDSTRING для таких конъюнктивных правил или это ложная надежда на не написанные от руки парсеры?

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете просто перечислить ключевые слова, которые разрешены в качестве идентификаторов, в качестве альтернативы в правиле id:

id: IDSTRING | CORE | ... ;
...