// Ничего не возвращает, просто инициализирует _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); }
/// <summary> /// Visit a parse tree produced by <see cref="DoshikParser.variableDeclarator"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitVariableDeclarator([NotNull] DoshikParser.VariableDeclaratorContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="DoshikParser.variableDeclarator"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitVariableDeclarator([NotNull] DoshikParser.VariableDeclaratorContext context) { }