Как я могу различать объявленные переменные с одним и тем же правилом, но в другой области (ANTLR 4)? - PullRequest
1 голос
/ 08 мая 2020

Я разрабатываю свой собственный язык с помощью 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, так как я могу получить переменные, объявленные в каждом конкретном блоке c. Например, если мой DSL выглядит следующим образом:

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

x = "string3"
y = "string4"

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

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

1 Ответ

1 голос
/ 08 мая 2020

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

@Override 
public void enterSimpleAssign(YourParser.SimpleAssignContext ctx) { 
  if (ctx.parent instanceof YourParser.StudyParametersContext) {
    // called from `studyParameters`
  }
  else {
    // called from `assignVariableBlock`
  }
}
...