/// <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); } }
/// <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)); }