Beispiel #1
0
        public INfaVM Visit(OrNode node, INfaVM code)
        {
            int count = node.Children.Count;

            Ref <Labels>[] branch = new Ref <Labels> [count - 1];
            Ref <Labels>   end    = code.Labels.Generate().GetRef();

            for (int i = 1; i < count; ++i)
            {
                branch[i - 1] = code.Labels.Generate().GetRef();
                code.Fork(branch[i - 1]);
            }

            for (int i = 0; i != count; ++i)
            {
                if (i != 0)
                {
                    code.Label(branch[i - 1].Def);
                }

                node.Children[i].Accept(this, code);
                if (i != (count - 1))
                {
                    code.Jmp(end);
                }
            }

            code.Label(end.Def);

            return(code);
        }
Beispiel #2
0
        public TextWriter Visit(OrNode node)
        {
            NewLine();
            writer.Write("or:");
            IncreaseIndent();
            try
            {
                foreach (var child in node.Children)
                {
                    child.Accept(this);
                }
            }
            finally
            {
                DecreaseIndent();
            }

            return(writer);
        }
Beispiel #3
0
 public NfaFragment Visit(OrNode node)
 {
     return(NfaFragment.Or(node.Children.Select(Build)));
 }