// Ничего не возвращает, просто инициализирует _declaringVariable и _declaringVariableInitializerExpression public override object VisitVariableDeclarator([NotNull] DoshikParser.VariableDeclaratorContext context) { _compilationContext.SetParsingAntlrContext(context); _declaringVariable.Name = context.variableName.Text; // ToDo: Тут надо искать переменную не везде а только в текущем scope плюс в родительях, исключая все что выше определения метода. // то есть переменную заданную в параметрах переопределить нельзя, НО должно быть возможно переопределить переменную, заданную в "текущем классе"(то есть глобальную). Ее потом надо сделать чтобы // можно было вызывать по this.variable if (_currentScope.FindVariableByName(_declaringVariable.Name) != null) { throw _compilationContext.ThrowCompilationError($"variable { _declaringVariable.Name } is already defined"); } var variableInitializerCtx = context.variableInitializer(); // если != null значит инициализтор задан if (variableInitializerCtx != null) { // продолжаем изменять _declaringVariable _declaringVariableInitializerExpression = (ExpressionTree)Visit(variableInitializerCtx); } else { // иначе это просто объявление переменной без инициализации _declaringVariableInitializerExpression = null; } return(null); }
// возвращает (string variableName, DoshikParser.VariableInitializerContext variableInitializer) public override object VisitVariableDeclarator([NotNull] DoshikParser.VariableDeclaratorContext context) { _compilationContext.SetParsingAntlrContext(context); var variableName = context.variableName.Text; var variableInitializer = context.variableInitializer(); return(variableName, variableInitializer); }