예제 #1
0
        private IExpression HandleIdentifierExpressionNode(IdentifierExpressionNode node)
        {
            if (node.IsLeftOfDotExpression)
            {
                // Если нода с идентификатором упоминалась как левая часть dot выражения, значит нужно в ПЕРВУЮ ОЧЕРЕДЬ проверить не является ли
                // этот идентификатор названием типа

                var foundType = _compilationContext.TypeLibrary.FindTypeByCodeNameString(node.Identifier);
                if (foundType.DataType != null)
                {
                    return(new TypeHolderDummyExpression()
                    {
                        Type = foundType.DataType
                    });
                }
            }

            var result = new VariableReferenceExpression();

            var scope = _tree.FindNearestScopeOwner().Scope;

            var variable = scope.FindVariableByName(node.Identifier);

            if (variable == null)
            {
                throw _compilationContext.ThrowCompilationError($"variable { node.Identifier } is not defined");
            }

            result.Variable = variable;

            // Определяем выходное значение
            result.ReturnOutputSlot = new ExpressionSlot(result.Variable.Type, result);

            return(result);
        }
        public override object VisitIdentifierExpression([NotNull] DoshikParser.IdentifierExpressionContext context)
        {
            SetWholeExpression(context);
            VisitChildren(context);
            _compilationContext.SetParsingAntlrContext(context);

            var node = new IdentifierExpressionNode(context);

            node.Identifier = context.IDENTIFIER().GetText();

            Sequence.Sequence.Add(node);

            return(null);
        }