// Ничего не возвращает, просто инициализирует _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);
        }
Beispiel #3
0
 /// <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)
 {
 }