public override void VisitGoToNode(GoToNode g)
        {
            string labelName = g.Label.Name;
            // При посещении узла GoTо создаем соответсвующую команду трехадресного кода
            var gt = new TACNodes.Goto();

            code.AddNode(gt);

            // Если метка ведет в уже преобразованную часть программы
            if (labeledTANodes.ContainsKey(labelName))
            {
                // Получаем помеченную строку треадресного кода и задаем ее как цель перехода
                var target = labeledTANodes[labelName];
                gt.TargetLabel = target.Label;
            }
            else
            {
                // Иначе помещаем строку в лист ожидания пока помеченная часть программы не будет преобразована
                if (!forwardGotos.ContainsKey(labelName))
                {
                    forwardGotos.Add(labelName, new List <TACNodes.Goto>());
                }
                forwardGotos[labelName].Add(gt);
            }
        }
Exemple #2
0
        public void VisitGoToNode(GoToNode a)
        {
            string label = Mark(a);

            _nodes.AppendLine($"{label}  [label = \"GoTo: {a.Label.Name}\"]");

            a.Label.Visit(this);

            _edges.AppendLine($"{label} -> {Mark(a.Label)}");
        }
 /// <summary>
 /// Посещение узла с оператором goto
 /// </summary>
 /// <param name="g">Узел GoToNode</param>
 public virtual void VisitGoToNode(GoToNode g)
 {
     Text += IndentStr() + "goto ";
     g.Label.Visit(this);
 }
 public virtual void VisitGoToNode(GoToNode g)
 {
 }
 public virtual void VisitGoToNode(GoToNode g)
 {
     g.Label.Visit(this);
 }
 public override void VisitGoToNode(GoToNode g)
 {
     Text += IndentStr() + "goto ";
     g.Label.Visit(this);
 }