示例#1
0
        public PlusBlock(OutputModelFactory factory,
                         GrammarAST plusRoot,
                         IList <CodeBlockForAlt> alts)
            : base(factory, plusRoot, alts)
        {
            BlockAST            blkAST   = (BlockAST)plusRoot.GetChild(0);
            PlusBlockStartState blkStart = (PlusBlockStartState)blkAST.atnState;
            PlusLoopbackState   loop     = blkStart.loopBackState;

            stateNumber           = blkStart.loopBackState.stateNumber;
            blockStartStateNumber = blkStart.stateNumber;
            loopBackStateNumber   = loop.stateNumber;
            this.error            = GetThrowNoViableAlt(factory, plusRoot, null);
            decision = loop.decision;
        }
        public LL1PlusBlockSingleAlt(OutputModelFactory factory, GrammarAST plusRoot, IList <CodeBlockForAlt> alts)
            : base(factory, plusRoot, alts)
        {
            BlockAST            blkAST   = (BlockAST)plusRoot.GetChild(0);
            PlusBlockStartState blkStart = (PlusBlockStartState)blkAST.atnState;

            stateNumber           = blkStart.loopBackState.stateNumber;
            blockStartStateNumber = blkStart.stateNumber;
            PlusBlockStartState plus = (PlusBlockStartState)blkAST.atnState;

            this.decision = plus.loopBackState.decision;
            IntervalSet[] altLookSets = factory.GetGrammar().decisionLOOK[decision];

            IntervalSet loopBackLook = altLookSets[0];

            loopExpr = AddCodeForLoopLookaheadTempVar(loopBackLook);
        }
示例#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);
        }
示例#4
0
        public virtual Handle Plus([NotNull] GrammarAST plusAST, [NotNull] Handle blk)
        {
            PlusBlockStartState blkStart = (PlusBlockStartState)blk.left;

            BlockEndState blkEnd = (BlockEndState)blk.right;

            preventEpsilonClosureBlocks.Add(Tuple.Create <Rule, ATNState, ATNState>(currentRule, blkStart, blkEnd));

            PlusLoopbackState loop = NewState <PlusLoopbackState>(plusAST);

            loop.nonGreedy = !((QuantifierAST)plusAST).GetGreedy();
            loop.sll       = false; // no way to express SLL restriction
            atn.DefineDecisionState(loop);
            LoopEndState end = NewState <LoopEndState>(plusAST);

            blkStart.loopBackState = loop;
            end.loopBackState      = loop;

            plusAST.atnState = loop;
            Epsilon(blkEnd, loop);      // blk can see loop back

            BlockAST blkAST = (BlockAST)plusAST.GetChild(0);

            if (((QuantifierAST)plusAST).GetGreedy())
            {
                if (ExpectNonGreedy(blkAST))
                {
                    g.tool.errMgr.GrammarError(ErrorType.EXPECTED_NON_GREEDY_WILDCARD_BLOCK, g.fileName, plusAST.Token, plusAST.Token.Text);
                }

                Epsilon(loop, blkStart);    // loop back to start
                Epsilon(loop, end);         // or exit
            }
            else
            {
                // if not greedy, priority to exit branch; make it first
                Epsilon(loop, end);         // exit
                Epsilon(loop, blkStart);    // loop back to start
            }

            return(new Handle(blkStart, end));
        }
示例#5
0
        protected virtual void TryParse(T parser, List <MultipleDecisionData> potentialAlternatives, List <int> currentPath, IDictionary <RuleContext, CaretReachedException> results)
        {
            RuleContext parseTree;

            try
            {
                parser.Interpreter.SetFixedDecisions(potentialAlternatives, currentPath);
                parseTree          = ParseImpl(parser);
                results[parseTree] = null;
            }
            catch (CaretReachedException ex)
            {
                if (ex.Transitions == null)
                {
                    return;
                }

                if (ex.InnerException is FailedPredicateException)
                {
                    return;
                }

                for (parseTree = ex.FinalContext; parseTree.Parent != null; parseTree = parseTree.Parent)
                {
                    // intentionally blank
                }

                if (ex.InnerException != null)
                {
                    IntervalSet alts         = new IntervalSet();
                    IntervalSet semanticAlts = new IntervalSet();
                    foreach (ATNConfig c in ex.Transitions.Keys)
                    {
                        if (semanticAlts.Contains(c.Alt))
                        {
                            continue;
                        }

                        alts.Add(c.Alt);

                        var recognizer = parser as Recognizer <IToken, ParserATNSimulator>;
                        if (recognizer == null || c.SemanticContext.Eval(recognizer, ex.FinalContext))
                        {
                            semanticAlts.Add(c.Alt);
                        }
                    }

                    if (alts.Count != semanticAlts.Count)
                    {
                        Console.WriteLine("Forest decision {0} reduced to {1} by predicate evaluation.", alts, semanticAlts);
                    }

                    int inputIndex = parser.InputStream.Index;
                    int decision   = 0;

                    int      stateNumber = ex.InnerException.OffendingState;
                    ATNState state       = parser.Atn.states[stateNumber];
                    if (state is StarLoopbackState)
                    {
                        Debug.Assert(state.NumberOfTransitions == 1 && state.OnlyHasEpsilonTransitions);
                        Debug.Assert(state.Transition(0).target is StarLoopEntryState);
                        state = state.Transition(0).target;
                    }
                    else
                    {
                        PlusBlockStartState plusBlockStartState = state as PlusBlockStartState;
                        if (plusBlockStartState != null && plusBlockStartState.decision == -1)
                        {
                            state = plusBlockStartState.loopBackState;
                            Debug.Assert(state != null);
                        }
                    }

                    DecisionState decisionState = state as DecisionState;
                    if (decisionState != null)
                    {
                        decision = decisionState.decision;
                        if (decision < 0)
                        {
                            Debug.WriteLine(string.Format("No decision number found for state {0}.", state.stateNumber));
                        }
                    }
                    else
                    {
                        if (state != null)
                        {
                            Debug.WriteLine(string.Format("No decision number found for state {0}.", state.stateNumber));
                        }
                        else
                        {
                            Debug.WriteLine("No decision number found for state <null>.");
                        }

                        // continuing is likely to terminate
                        return;
                    }

                    Debug.Assert(semanticAlts.MinElement >= 1);
                    Debug.Assert(semanticAlts.MaxElement <= parser.Atn.decisionToState[decision].NumberOfTransitions);
                    int[] alternatives = semanticAlts.ToArray();

                    MultipleDecisionData decisionData = new MultipleDecisionData(inputIndex, decision, alternatives);
                    potentialAlternatives.Add(decisionData);
                    currentPath.Add(-1);
                }
                else
                {
                    results[parseTree] = ex;
                }
            }
            catch (RecognitionException ex)
            {
                // not a viable path
            }
        }