Пользовательские переменные контекста в Antlr4 посетителя в JavaScript - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу заменить переменные на входе их значением из переменных javascript. Возможно, что имя переменной является путем к объекту с функциями в середине или в конце: object.property.someFunction().propertyOfFunctionResult.

Грамматика для этого выглядит следующим образом:

funParameter: '(' value? (', ' value)*  ')' ;
value: INT | BOOL | STRING | variable;
varname: VAR ;
variable: (varname | '{' value '}') funParameter? ('.' variable)* ;

Функция посетителя для variable (все, что связано с customValue - это просто то, как я себе представляю, как это сделать):

visitVariable(ctx) {
  var key, val;
  if(ctx.value()) {
    key = this.visit(ctx.value());
  } else if(ctx.varname()) {
    key = ctx.varname().getText();
  }
  if(ctx.funParameter()) {
    //idea:
    val = this.callFunction(key, this.visit(ctx.funParameter()), ctx.customValue); //pass value to function call
  } else {
    //idea:
    if(ctx.customValue) {
      val = ctx.customValue[key]; //Get value from parent
    } else {
      val = this.vars[key]; //Get value from JS-variables
    }
  }
  if(ctx.variable()) {
     //idea:
    val = this.visit(ctx.variable(), {customValue:val});
  } 
  return val;
}

Проблема в том, что я не знаю, как передать текущее значение JS-переменной в дерево разбора. Когда оценивается object, мне нужно будет передать JS-объект посетителю, чтобы в следующем visitVariable стало ясно, что я хочу вернуть значение object.property. Любые советы приветствуются.

1 Ответ

0 голосов
/ 12 апреля 2019

Это, вероятно, взломано, но функция getParent(), описанная в документации, не была доступна в ctx -объекте.Но я нашел ctx.parentCtx.Теперь я просто назначаю ctx.customValue = 'somevalue' и могу получить к нему доступ от детей с ctx.parentCtx.customValue.

...