Package org.antlr.v4.tool.ast

Examples of org.antlr.v4.tool.ast.RuleAST


        {
          elementOptions.append("tokenIndex=").append(tok.getTokenIndex());
        }

        if ( node instanceof GrammarASTWithOptions ) {
          GrammarASTWithOptions o = (GrammarASTWithOptions)node;
          for (Map.Entry<String, GrammarAST> entry : o.getOptions().entrySet()) {
            if (elementOptions.length() > 0) {
              elementOptions.append(',');
            }

            elementOptions.append(entry.getKey());
View Full Code Here


        }
      }
      // create for each literal: (RULE <uniquename> (BLOCK (ALT <lit>))
      String rname = combinedGrammar.getStringLiteralLexerRuleName(lit);
      // can't use wizard; need special node types
      GrammarAST litRule = new RuleAST(ANTLRParser.RULE);
      BlockAST blk = new BlockAST(ANTLRParser.BLOCK);
      AltAST alt = new AltAST(ANTLRParser.ALT);
      TerminalAST slit = new TerminalAST(new CommonToken(ANTLRParser.STRING_LITERAL, lit));
      alt.addChild(slit);
      blk.addChild(alt);
      CommonToken idToken = new CommonToken(ANTLRParser.TOKEN_REF, rname);
      litRule.addChild(new TerminalAST(idToken));
      litRule.addChild(blk);
      lexerRulesRoot.insertChild(insertIndex, litRule);
//      lexerRulesRoot.getChildren().add(0, litRule);
      lexerRulesRoot.freshenParentAndChildIndexes(); // reset indexes and set litRule parent

      // next literal will be added after the one just added
View Full Code Here

      "s11->RuleStop_a_3\n" +
      "RuleStop_a_3->s5\n";
    checkRuleATN(g, "a", expecting);
    // Get all AST -> ATNState relationships. Make sure loopback is covered when no loop entry decision
    List<GrammarAST> ruleNodes = g.ast.getNodesWithType(ANTLRParser.RULE);
    RuleAST a = (RuleAST)ruleNodes.get(1);
    List<GrammarAST> nodesInRule = a.getNodesWithType(null);
    Map<GrammarAST, ATNState> covered = new LinkedHashMap<GrammarAST, ATNState>();
    for (GrammarAST node : nodesInRule) {
      if ( node.atnState != null ) {
        covered.put(node, node.atnState);
      }
View Full Code Here

        }
        if ( ruleNode instanceof RuleAST ) {
          String ruleName = ((RuleAST) ruleNode).getRuleName();
          Rule r = ast.g.getRule(ruleName);
          if ( r instanceof LeftRecursiveRule ) {
            RuleAST originalAST = ((LeftRecursiveRule) r).getOriginalAST();
            tokenRegion = Interval.of(originalAST.getTokenStartIndex(), originalAST.getTokenStopIndex());
          }
        }
        stateToGrammarRegionMap.put(n.atnState.stateNumber, tokenRegion);
      }
    }
View Full Code Here

    // replace old rule's AST
    GrammarAST RULES = (GrammarAST)ast.getFirstChildWithType(ANTLRParser.RULES);
    String newRuleText = leftRecursiveRuleWalker.getArtificialOpPrecRule();
//    System.out.println("created: "+newRuleText);
    RuleAST t = parseArtificialRule(g, newRuleText);

    // reuse the name token from the original AST since it refers to the proper source location in the original grammar
    ((GrammarAST)t.getChild(0)).token = ((GrammarAST)prevRuleAST.getChild(0)).getToken();

    // update grammar AST and set rule's AST.
    RULES.setChild(prevRuleAST.getChildIndex(), t);
    r.ast = t;

    // Reduce sets in newly created rule tree
    GrammarTransformPipeline transform = new GrammarTransformPipeline(g, g.tool);
    transform.reduceBlocksToSets(r.ast);
    transform.expandParameterizedLoops(r.ast);

    // Rerun semantic checks on the new rule
    RuleCollector ruleCollector = new RuleCollector(g);
    ruleCollector.visit(t, "rule");
    BasicSemanticChecks basics = new BasicSemanticChecks(g, ruleCollector);
    // disable the assoc element option checks because they are already
    // handled for the pre-transformed rule.
    basics.checkAssocElementOption = false;
    basics.visit(t, "rule");

    // track recursive alt info for codegen
    r.recPrimaryAlts = new ArrayList<LeftRecursiveRuleAltInfo>();
    r.recPrimaryAlts.addAll(leftRecursiveRuleWalker.prefixAlts);
    r.recPrimaryAlts.addAll(leftRecursiveRuleWalker.otherAlts);
    if (r.recPrimaryAlts.isEmpty()) {
      tool.errMgr.grammarError(ErrorType.NO_NON_LR_ALTS, g.fileName, ((GrammarAST)r.ast.getChild(0)).getToken(), r.name);
    }

    r.recOpAlts = new OrderedHashMap<Integer, LeftRecursiveRuleAltInfo>();
    r.recOpAlts.putAll(leftRecursiveRuleWalker.binaryAlts);
    r.recOpAlts.putAll(leftRecursiveRuleWalker.ternaryAlts);
    r.recOpAlts.putAll(leftRecursiveRuleWalker.suffixAlts);

    // walk alt info records and set their altAST to point to appropriate ALT subtree
    // from freshly created AST
    setAltASTPointers(r, t);

    // update Rule to just one alt and add prec alt
    ActionAST arg = (ActionAST)r.ast.getFirstChildWithType(ANTLRParser.ARG_ACTION);
    if ( arg!=null ) {
      r.args = ScopeParser.parseTypedArgList(arg, arg.getText(), g);
      r.args.type = AttributeDict.DictType.ARG;
      r.args.ast = arg;
      arg.resolver = r.alt[1]; // todo: isn't this Rule or something?
    }

    // define labels on recursive rule refs we delete; they don't point to nodes of course
    // these are so $label in action translation works
    for (Pair<GrammarAST,String> pair : leftRecursiveRuleWalker.leftRecursiveRuleRefLabels) {
      GrammarAST labelNode = pair.a;
      GrammarAST labelOpNode = (GrammarAST)labelNode.getParent();
      GrammarAST elementNode = (GrammarAST)labelOpNode.getChild(1);
      LabelElementPair lp = new LabelElementPair(g, labelNode, elementNode, labelOpNode.getType());
      r.alt[1].labelDefs.map(labelNode.getText(), lp);
    }
    // copy to rule from walker
    r.leftRecursiveRuleRefLabels = leftRecursiveRuleWalker.leftRecursiveRuleRefLabels;

    tool.log("grammar", "added: "+t.toStringTree());
    return true;
  }
View Full Code Here

    ToolANTLRParser p = new ToolANTLRParser(tokens, tool);
    p.setTreeAdaptor(adaptor);
    Token ruleStart = null;
    try {
      ParserRuleReturnScope r = p.rule();
      RuleAST tree = (RuleAST)r.getTree();
      ruleStart = (Token)r.getStart();
      GrammarTransformPipeline.setGrammarPtr(g, tree);
      GrammarTransformPipeline.augmentTokensWithOriginalPosition(g, tree);
      return tree;
    }
View Full Code Here

    }

    boolean redefinition = false;
    final Map<String, RuleAST> ruleToAST = new HashMap<String, RuleAST>();
    for (GrammarAST r : rules) {
      RuleAST ruleAST = (RuleAST)r;
      GrammarAST ID = (GrammarAST)ruleAST.getChild(0);
      String ruleName = ID.getText();
      RuleAST prev = ruleToAST.get(ruleName);
      if ( prev !=null ) {
        GrammarAST prevChild = (GrammarAST)prev.getChild(0);
        g.tool.errMgr.grammarError(ErrorType.RULE_REDEFINITION,
                       g.fileName,
                       ID.getToken(),
                       ruleName,
                       prevChild.getToken().getLine());
        redefinition = true;
        continue;
      }
      ruleToAST.put(ruleName, ruleAST);
    }

    // check for undefined rules
    class UndefChecker extends GrammarTreeVisitor {
      public boolean badref = false;
      @Override
      public void tokenRef(TerminalAST ref) {
        if ("EOF".equals(ref.getText())) {
          // this is a special predefined reference
          return;
        }

        if ( g.isLexer() ) ruleRef(ref, null);
      }

      @Override
      public void ruleRef(GrammarAST ref, ActionAST arg) {
        RuleAST ruleAST = ruleToAST.get(ref.getText());
        if (Character.isUpperCase(currentRuleName.charAt(0)) &&
          Character.isLowerCase(ref.getText().charAt(0)))
        {
          badref = true;
          String fileName = ref.getToken().getInputStream().getSourceName();
View Full Code Here

    /** Make sure even imaginary nodes know the input stream */
    public Object create(int tokenType, String text) {
    GrammarAST t;
    if ( tokenType==ANTLRParser.RULE ) {
      // needed by TreeWizard to make RULE tree
          t = new RuleAST(new CommonToken(tokenType, text));
    }
    else if ( tokenType==ANTLRParser.STRING_LITERAL ) {
      // implicit lexer construction done with wizard; needs this node type
      // whereas grammar ANTLRParser.g can use token option to spec node type
      t = new TerminalAST(new CommonToken(tokenType, text));
View Full Code Here

        if ( g.isLexer() ) ruleRef(ref, null);
      }

      @Override
      public void ruleRef(GrammarAST ref, ActionAST arg) {
        RuleAST ruleAST = ruleToAST.get(ref.getText());
        if (Character.isUpperCase(currentRuleName.charAt(0)) &&
          Character.isLowerCase(ref.getText().charAt(0)))
        {
          badref = true;
          String fileName = ref.getToken().getInputStream().getSourceName();
View Full Code Here

  public AltAST addPrecedenceArgToRules(AltAST t, int prec) {
    if ( t==null ) return null;
    // get all top-level rule refs from ALT
    List<GrammarAST> outerAltRuleRefs = t.getNodesWithTypePreorderDFS(IntervalSet.of(RULE_REF));
    for (GrammarAST x : outerAltRuleRefs) {
      RuleRefAST rref = (RuleRefAST)x;
      boolean recursive = rref.getText().equals(ruleName);
      boolean rightmost = rref == outerAltRuleRefs.get(outerAltRuleRefs.size()-1);
      if ( recursive && rightmost ) {
        GrammarAST dummyValueNode = new GrammarAST(new CommonToken(ANTLRParser.INT, ""+prec));
        rref.setOption(LeftRecursiveRuleTransformer.PRECEDENCE_OPTION_NAME, dummyValueNode);
      }
    }
    return t;
  }
View Full Code Here

TOP

Related Classes of org.antlr.v4.tool.ast.RuleAST

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.