java类org.antlr.v4.runtime.misc.Pair的实例源码

CollectTokenPairs.java 文件源码 项目:codebuff 阅读 20 收藏 0 点赞 0 评论 0
/** Return a new map from rulename to List of (a,b) pairs stripped of
 *  tuples (a,b) where a or b is in rule repeated token set.
 *  E.g., before removing repeated token ',', we see:
 *
 *  elementValueArrayInitializer: 4:'{',',' 1:'{','}' 4:',','}'
 *
 *  After removing tuples containing repeated tokens, we get:
 *
 *  elementValueArrayInitializer: 1:'{','}'
*/
protected Map<RuleAltKey,List<Pair<Integer,Integer>>> stripPairsWithRepeatedTokens() {
    Map<RuleAltKey,List<Pair<Integer,Integer>>> ruleToPairsWoRepeats = new HashMap<>();
    // For each rule
    for (RuleAltKey ruleAltKey : ruleToPairsBag.keySet()) {
        Set<Integer> ruleRepeatedTokens = ruleToRepeatedTokensSet.get(ruleAltKey);
        Set<Pair<Integer, Integer>> pairsBag = ruleToPairsBag.get(ruleAltKey);
        // If there are repeated tokens for this rule
        if ( ruleRepeatedTokens!=null ) {
            // Remove all (a,b) for b in repeated token set
            List<Pair<Integer, Integer>> pairsWoRepeats =
                BuffUtils.filter(pairsBag,
                                    p -> !ruleRepeatedTokens.contains(p.a) && !ruleRepeatedTokens.contains(p.b));
            ruleToPairsWoRepeats.put(ruleAltKey, pairsWoRepeats);
        }
        else {
            ruleToPairsWoRepeats.put(ruleAltKey, new ArrayList<>(pairsBag));
        }
    }
    return ruleToPairsWoRepeats;
}
IdentifyOversizeLists.java 文件源码 项目:codebuff 阅读 18 收藏 0 点赞 0 评论 0
public void visitNonSingletonWithSeparator(ParserRuleContext ctx,
                                           List<? extends ParserRuleContext> siblings,
                                           Token separator)
{
    boolean oversize = isOversizeList(ctx, siblings, separator);
    Map<Token, Pair<Boolean, Integer>> tokenInfo =
        getInfoAboutListTokens(ctx, tokens, tokenToNodeMap, siblings, oversize);

    // copy sibling list info for associated tokens into overall list
    // but don't overwrite existing so that most general (largest construct)
    // list information is use/retained (i.e., not overwritten).
    for (Token t : tokenInfo.keySet()) {
        if ( !tokenToListInfo.containsKey(t) ) {
            tokenToListInfo.put(t, tokenInfo.get(t));
        }
    }
}
Rule.java 文件源码 项目:codebuff 阅读 32 收藏 0 点赞 0 评论 0
/**
 * Get {@code #} labels. The keys of the map are the labels applied to outer
 * alternatives of a lexer rule, and the values are collections of pairs
 * (alternative number and {@link AltAST}) identifying the alternatives with
 * this label. Unlabeled alternatives are not included in the result.
 */
public Map<String, List<Pair<Integer, AltAST>>> getAltLabels() {
    Map<String, List<Pair<Integer, AltAST>>> labels = new LinkedHashMap<String, List<Pair<Integer, AltAST>>>();
    for (int i=1; i<=numberOfAlts; i++) {
        GrammarAST altLabel = alt[i].ast.altLabel;
        if ( altLabel!=null ) {
            List<Pair<Integer, AltAST>> list = labels.get(altLabel.getText());
            if (list == null) {
                list = new ArrayList<Pair<Integer, AltAST>>();
                labels.put(altLabel.getText(), list);
            }

            list.add(new Pair<Integer, AltAST>(i, alt[i].ast));
        }
    }
    if ( labels.isEmpty() ) return null;
    return labels;
}
LeftRecursiveRuleAnalyzer.java 文件源码 项目:codebuff 阅读 22 收藏 0 点赞 0 评论 0
@Override
    public void suffixAlt(AltAST originalAltTree, int alt) {
        AltAST altTree = (AltAST)originalAltTree.dupTree();
        String altLabel = altTree.altLabel!=null ? altTree.altLabel.getText() : null;

        String label = null;
        boolean isListLabel = false;
        GrammarAST lrlabel = stripLeftRecursion(altTree);
        if ( lrlabel!=null ) {
            label = lrlabel.getText();
            isListLabel = lrlabel.getParent().getType() == PLUS_ASSIGN;
            leftRecursiveRuleRefLabels.add(new Pair<GrammarAST,String>(lrlabel,altLabel));
        }
        stripAltLabel(altTree);
        String altText = text(altTree);
        altText = altText.trim();
        LeftRecursiveRuleAltInfo a =
            new LeftRecursiveRuleAltInfo(alt, altText, label, altLabel, isListLabel, originalAltTree);
        suffixAlts.put(alt, a);
//      System.out.println("suffixAlt " + alt + ": " + altText + ", rewrite=" + rewriteText);
    }
ListenerFile.java 文件源码 项目:codebuff 阅读 16 收藏 0 点赞 0 评论 0
public ListenerFile(OutputModelFactory factory, String fileName) {
    super(factory, fileName);
    Grammar g = factory.getGrammar();
    parserName = g.getRecognizerName();
    grammarName = g.name;
    for (Rule r : g.rules.values()) {
        Map<String, List<Pair<Integer,AltAST>>> labels = r.getAltLabels();
        if ( labels!=null ) {
            for (Map.Entry<String, List<Pair<Integer, AltAST>>> pair : labels.entrySet()) {
                listenerNames.add(pair.getKey());
                listenerLabelRuleNames.put(pair.getKey(), r.name);
            }
        }
        else {
            // only add rule context if no labels
            listenerNames.add(r.name);
        }
    }
    ActionAST ast = g.namedActions.get("header");
    if ( ast!=null ) header = new Action(factory, ast);
    genPackage = factory.getGrammar().tool.genPackage;
}
VisitorFile.java 文件源码 项目:codebuff 阅读 17 收藏 0 点赞 0 评论 0
public VisitorFile(OutputModelFactory factory, String fileName) {
    super(factory, fileName);
    Grammar g = factory.getGrammar();
    parserName = g.getRecognizerName();
    grammarName = g.name;
    for (Rule r : g.rules.values()) {
        Map<String, List<Pair<Integer, AltAST>>> labels = r.getAltLabels();
        if ( labels!=null ) {
            for (Map.Entry<String, List<Pair<Integer, AltAST>>> pair : labels.entrySet()) {
                visitorNames.add(pair.getKey());
                visitorLabelRuleNames.put(pair.getKey(), r.name);
            }
        }
        else {
            // if labels, must label all. no need for generic rule visitor then
            visitorNames.add(r.name);
        }
    }
    ActionAST ast = g.namedActions.get("header");
    if ( ast!=null ) header = new Action(factory, ast);
    genPackage = factory.getGrammar().tool.genPackage;
}
ParseTreeDOMSerializer.java 文件源码 项目:mdetect 阅读 32 收藏 0 点赞 0 评论 0
@Override
  public void enterEveryRule(ParserRuleContext ctx) { 
      String ruleName = extractRuleName(ctx);
      Pair<Integer, Integer> interval = getLineRange(ctx);
      Element newNode = (Element) domDoc.createElement(ruleName);
if (interval != null) {
    newNode.setAttribute("start", Integer.toString(interval.a));
    newNode.setAttribute("end", Integer.toString(interval.b));
}

if (debugMode) {
    System.out.println("enter->" + ruleName);
}
if (ctx.getText() != null && ctx.getChildCount() == 0) {
    //newNode.setTextContent(ctx.getText());
    newNode.appendChild(domDoc.createTextNode(ctx.getText()));
}
nodeStack.peek().appendChild(newNode);
nodeStack.push(newNode);
  }
ParseUtils.java 文件源码 项目:mdetect 阅读 25 收藏 0 点赞 0 评论 0
public static Pair<Parser, Lexer> parsePHP(String filePath) {
    AntlrCaseInsensitiveFileStream input;
try {
    input = new AntlrCaseInsensitiveFileStream(filePath);
} catch (IOException e) {
    e.printStackTrace();
    return null;
}
      PHPLexer lexer = new PHPLexer(input);
      CommonTokenStream tokens = new CommonTokenStream(lexer);
      PHPParser parser = new InterruptablePHPParser(tokens, filePath);
      /* turn on prediction mode to speed up parsing */
      parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
      Pair<Parser, Lexer> retval = new Pair<Parser, Lexer>(parser, lexer);
      return retval;
  }
ParseUtils.java 文件源码 项目:mdetect 阅读 21 收藏 0 点赞 0 评论 0
public static Document processFile(String filePath) {
    Pair<Parser, Lexer> pl = parsePHP(filePath);
    PHPParser parser = (PHPParser) pl.a;
    parser.setBuildParseTree(true);
    /* 
     * htmlDocument is the start rule (the top-level rule)
     * for the PHP grammar
     */
    ParserRuleContext tree =   parser.htmlDocument();
    List<String> ruleNames = Arrays.asList(parser.getRuleNames());
    Map<Integer, String> invTokenMap = getInvTokenMap(parser);
    TokenStream tokenStream = parser.getTokenStream();
    ParseTreeDOMSerializer ptSerializer = new ParseTreeDOMSerializer(ruleNames, invTokenMap, tokenStream);
    ParseTreeWalker.DEFAULT.walk(ptSerializer, tree);
    Document result= ptSerializer.getDOMDocument();
    return result;
}
PSITokenSource.java 文件源码 项目:jetbrains 阅读 23 收藏 0 点赞 0 评论 0
/** Create an ANTLR Token from the current token type of the builder
     *  then advance the builder to next token (which ultimately calls an
     *  ANTLR lexer).  The {@link ANTLRLexerAdaptor} creates tokens via
     *  an ANTLR lexer but converts to {@link TokenIElementType} and here
     *  we have to convert back to an ANTLR token using what info we
     *  can get from the builder. We lose info such as the original channel.
     *  So, whitespace and comments (typically hidden channel) will look like
     *  real tokens. Jetbrains uses {@link ParserDefinition#getWhitespaceTokens()}
     *  and {@link ParserDefinition#getCommentTokens()} to strip these before
     *  our ANTLR parser sees them.
     */
    @Override
    public Token nextToken() {
        ProgressIndicatorProvider.checkCanceled();

        TokenIElementType ideaTType = (TokenIElementType)builder.getTokenType();
        int type = ideaTType!=null ? ideaTType.getANTLRTokenType() : Token.EOF;

        int channel = Token.DEFAULT_CHANNEL;
        Pair<TokenSource, CharStream> source = new Pair<TokenSource, CharStream>(this, null);
        String text = builder.getTokenText();
        int start = builder.getCurrentOffset();
        int length = text != null ? text.length() : 0;
        int stop = start + length - 1;
        // PsiBuilder doesn't provide line, column info
        int line = 0;
        int charPositionInLine = 0;
        Token t = tokenFactory.create(source, type, text, channel, start, stop, line, charPositionInLine);
        builder.advanceLexer();
//      System.out.println("TOKEN: "+t);
        return t;
    }


问题


面经


文章

微信
公众号

扫码关注公众号