Я хочу заменить переменные на входе их значением из переменных 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
.
Любые советы приветствуются.