Search in sources :

Example 16 with org.antlr.v4.runtime.tree

use of org.antlr.v4.runtime.tree in project antlr4 by tunnelvisionlabs.

the class ParserATNFactory method createATN.

@NotNull
@Override
public ATN createATN() {
    _createATN(g.rules.values());
    assert atn.maxTokenType == g.getMaxTokenType();
    addRuleFollowLinks();
    addEOFTransitionToStartRules();
    ATNOptimizer.optimize(g, atn);
    for (Tuple3<? extends Rule, ? extends ATNState, ? extends ATNState> pair : preventEpsilonClosureBlocks) {
        LL1Analyzer analyzer = new LL1Analyzer(atn);
        ATNState blkStart = pair.getItem2();
        ATNState blkStop = pair.getItem3();
        IntervalSet lookahead = analyzer.LOOK(blkStart, blkStop, PredictionContext.EMPTY_LOCAL);
        if (lookahead.contains(org.antlr.v4.runtime.Token.EPSILON)) {
            ErrorType errorType = pair.getItem1() instanceof LeftRecursiveRule ? ErrorType.EPSILON_LR_FOLLOW : ErrorType.EPSILON_CLOSURE;
            g.tool.errMgr.grammarError(errorType, g.fileName, ((GrammarAST) pair.getItem1().ast.getChild(0)).getToken(), pair.getItem1().name);
        }
    }
    optionalCheck: for (Tuple3<? extends Rule, ? extends ATNState, ? extends ATNState> pair : preventEpsilonOptionalBlocks) {
        int bypassCount = 0;
        for (int i = 0; i < pair.getItem2().getNumberOfTransitions(); i++) {
            ATNState startState = pair.getItem2().transition(i).target;
            if (startState == pair.getItem3()) {
                bypassCount++;
                continue;
            }
            LL1Analyzer analyzer = new LL1Analyzer(atn);
            if (analyzer.LOOK(startState, pair.getItem3(), PredictionContext.EMPTY_LOCAL).contains(org.antlr.v4.runtime.Token.EPSILON)) {
                g.tool.errMgr.grammarError(ErrorType.EPSILON_OPTIONAL, g.fileName, ((GrammarAST) pair.getItem1().ast.getChild(0)).getToken(), pair.getItem1().name);
                continue optionalCheck;
            }
        }
        if (bypassCount != 1) {
            throw new UnsupportedOperationException("Expected optional block with exactly 1 bypass alternative.");
        }
    }
    return atn;
}
Also used : LeftRecursiveRule(org.antlr.v4.tool.LeftRecursiveRule) LL1Analyzer(org.antlr.v4.runtime.atn.LL1Analyzer) ErrorType(org.antlr.v4.tool.ErrorType) IntervalSet(org.antlr.v4.runtime.misc.IntervalSet) Tuple3(org.antlr.v4.runtime.misc.Tuple3) GrammarAST(org.antlr.v4.tool.ast.GrammarAST) Rule(org.antlr.v4.tool.Rule) LeftRecursiveRule(org.antlr.v4.tool.LeftRecursiveRule) ATNState(org.antlr.v4.runtime.atn.ATNState) NotNull(org.antlr.v4.runtime.misc.NotNull)

Aggregations

IOException (java.io.IOException)7 InputStream (java.io.InputStream)6 CharStream (org.antlr.v4.runtime.CharStream)5 RecognitionException (org.antlr.v4.runtime.RecognitionException)5 CommonTokenStream (org.antlr.v4.runtime.CommonTokenStream)4 NoViableAltException (org.antlr.v4.runtime.NoViableAltException)4 BufferedReader (java.io.BufferedReader)3 InputStreamReader (java.io.InputStreamReader)3 ANTLRInputStream (org.antlr.v4.runtime.ANTLRInputStream)3 ParseCancellationException (org.antlr.v4.runtime.misc.ParseCancellationException)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 FileNotFoundException (java.io.FileNotFoundException)2 BailErrorStrategy (org.antlr.v4.runtime.BailErrorStrategy)2 DefaultErrorStrategy (org.antlr.v4.runtime.DefaultErrorStrategy)2 ATNState (org.antlr.v4.runtime.atn.ATNState)2 LL1Analyzer (org.antlr.v4.runtime.atn.LL1Analyzer)2 IntervalSet (org.antlr.v4.runtime.misc.IntervalSet)2 ParseTree (org.antlr.v4.runtime.tree.ParseTree)2 ParseTreeWalker (org.antlr.v4.runtime.tree.ParseTreeWalker)2 ErrorType (org.antlr.v4.tool.ErrorType)2