Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }