Esempio n. 1
0
        /// <summary>
        /// Зарежда нужната информация в стуктурите от данни.
        /// </summary>
        private void PopulateVariables()
        {
            variables.Clear();
            firstAssignment.Clear();
            blockStack.Clear();

            foreach (VariableDefinition variable in context.Variables)
            {
                variables[variable]       = null;
                firstAssignment[variable] = new FirstAssignmentInfo(null, null);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Ако срещнем присвояване стойност на променлива, която няма записан стек в таблицата
        /// означава, че нейната декларация е заедно с присвояването.
        /// <example>
        /// Например:
        /// <code>int a = 5</code>
        /// </example>
        /// В такъв случай записваме променливата в таблицата за променливи декларация-на-първо-присвояване.
        /// </summary>
        /// <param name="node">Текущ връх</param>
        /// <returns>Обработен връх</returns>
        public override ICodeNode VisitAssignExpression(AssignExpression node)
        {
            VariableReferenceExpression varRefExp = node.Target as VariableReferenceExpression;

            if (varRefExp != null)
            {
                VariableDefinition varDef = varRefExp.Variable.Resolve();
                if (firstAssignment[varDef].assignExpression == null)
                {
                    firstAssignment[varDef] = new FirstAssignmentInfo(node, blockStack.Peek());
                }
            }

            return(base.VisitAssignExpression(node));
        }