Хобрук: Ваш путь к мастерству в программировании

Как я могу различать объявленные переменные с одним и тем же правилом, но в разных областях (ANTLR 4)?

Я разрабатываю свой собственный язык с помощью ANTLR 4, вот часть моей грамматики.

program: main EOF;  // the program rule. 
main:  NEWLINE* study  NEWLINE* ; // the main rule;
study : studyBlock (NEWLINE* assignVariableBlock)? ;  // the study rule.
/* simple assign name = "name" */
simpleAssign: name = ID  '=' value = (STRING | BOOLEAN | INTEGER | DOUBLE);
/* study parameters */
studyParameters: (| ( simpleAssign (',' simpleAssign)*) );
/* study block */
studyBlock: 'study' '(' studyParameters  ')' NEWLINE ;
/* assign variables block */
assignVariableBlock: simpleAssign*;

Правило simpleAssign используется в правиле studyParameters и в правиле assignVariableBlock, поэтому как я могу получить переменные, объявленные в каждом конкретном блоке. Например, если мой DSL выглядит следующим образом.

study(string = "string", string2 = "string2")

x = "string3"
y = "string4"

Как я могу иметь в своем слушателе

// study parameters
[string:"string",string2:"string2"] // map 
// tmp variabels
[x:"string3",y:"string4"] // map
08.05.2020

Ответы:


1

Вы можете проверить переменную parent контекста:

@Override 
public void enterSimpleAssign(YourParser.SimpleAssignContext ctx) { 
  if (ctx.parent instanceof YourParser.StudyParametersContext) {
    // called from `studyParameters`
  }
  else {
    // called from `assignVariableBlock`
  }
}
08.05.2020
Новые материалы

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..