protected virtual Handle MakeBlock([NotNull] BlockStartState start, [NotNull] BlockAST blkAST, [NotNull] IList <Handle> alts) { start.sll = IsSLLDecision(blkAST); BlockEndState end = NewState <BlockEndState>(blkAST); start.endState = end; foreach (Handle alt in alts) { // hook alts up to decision block Epsilon(start, alt.left); Epsilon(alt.right, end); // no back link in ATN so must walk entire alt to see if we can // strip out the epsilon to 'end' state TailEpsilonRemover opt = new TailEpsilonRemover(atn); opt.Visit(alt.left); } Handle h = new Handle(start, end); // FASerializer ser = new FASerializer(g, h.left); // System.out.println(blkAST.toStringTree()+":\n"+ser); blkAST.atnState = start; return(h); }
public virtual Handle Optional([NotNull] GrammarAST optAST, [NotNull] Handle blk) { BlockStartState blkStart = (BlockStartState)blk.left; ATNState blkEnd = blk.right; preventEpsilonOptionalBlocks.Add(Tuple.Create <Rule, ATNState, ATNState>(currentRule, blkStart, blkEnd)); bool greedy = ((QuantifierAST)optAST).GetGreedy(); blkStart.sll = false; // no way to express SLL restriction blkStart.nonGreedy = !greedy; Epsilon(blkStart, blk.right, !greedy); optAST.atnState = blk.left; return(blk); }
public virtual Handle Block([NotNull] BlockAST blkAST, [NotNull] GrammarAST ebnfRoot, [NotNull] IList <Handle> alts) { if (ebnfRoot == null) { if (alts.Count == 1) { Handle h = alts[0]; blkAST.atnState = h.left; return(h); } BlockStartState start = NewState <BasicBlockStartState>(blkAST); if (alts.Count > 1) { atn.DefineDecisionState(start); } return(MakeBlock(start, blkAST, alts)); } switch (ebnfRoot.Type) { case ANTLRParser.OPTIONAL: BlockStartState start = NewState <BasicBlockStartState>(blkAST); atn.DefineDecisionState(start); Handle h = MakeBlock(start, blkAST, alts); return(Optional(ebnfRoot, h)); case ANTLRParser.CLOSURE: BlockStartState star = NewState <StarBlockStartState>(ebnfRoot); if (alts.Count > 1) { atn.DefineDecisionState(star); } h = MakeBlock(star, blkAST, alts); return(Star(ebnfRoot, h)); case ANTLRParser.POSITIVE_CLOSURE: PlusBlockStartState plus = NewState <PlusBlockStartState>(ebnfRoot); if (alts.Count > 1) { atn.DefineDecisionState(plus); } h = MakeBlock(plus, blkAST, alts); return(Plus(ebnfRoot, h)); } return(null); }