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); }
public TextWriter Visit(OrNode node) { NewLine(); writer.Write("or:"); IncreaseIndent(); try { foreach (var child in node.Children) { child.Accept(this); } } finally { DecreaseIndent(); } return(writer); }
public NfaFragment Visit(OrNode node) { return(NfaFragment.Or(node.Children.Select(Build))); }