Package org.stringtemplate.v4

Examples of org.stringtemplate.v4.InstanceScope


  public void testActions(String templates, String actionName, String action, String expected) throws org.antlr.runtime.RecognitionException {
    int lp = templates.indexOf('(');
    String name = templates.substring(0, lp);
    STGroup group = new STGroupString(templates);
    ST st = group.getInstanceOf(name);
    st.add(actionName, action);
    String grammar = st.render();
    ErrorQueue equeue = new ErrorQueue();
    Grammar g = new Grammar(grammar, equeue);
    if ( g.ast!=null && !g.ast.hasErrors ) {
      SemanticPipeline sem = new SemanticPipeline(g);
      sem.process();

      ATNFactory factory = new ParserATNFactory(g);
      if ( g.isLexer() ) factory = new LexerATNFactory((LexerGrammar)g);
      g.atn = factory.createATN();

      CodeGenerator gen = new CodeGenerator(g);
      ST outputFileST = gen.generateParser();
      String output = outputFileST.render();
      //System.out.println(output);
      String b = "#" + actionName + "#";
      int start = output.indexOf(b);
      String e = "#end-" + actionName + "#";
      int end = output.indexOf(e);
View Full Code Here


                 String lexerName,
                 String parserStartRuleName,
                 boolean debug,
                 boolean profile)
  {
    ST outputFileST = new ST(
      "import org.antlr.v4.runtime.*;\n" +
      "import org.antlr.v4.runtime.tree.*;\n" +
      "import org.antlr.v4.runtime.atn.*;\n" +
      "import java.util.Arrays;\n"+
      "\n" +
      "public class Test {\n" +
      "    public static void main(String[] args) throws Exception {\n" +
      "        CharStream input = new ANTLRFileStream(args[0]);\n" +
      "        <lexerName> lex = new <lexerName>(input);\n" +
      "        CommonTokenStream tokens = new CommonTokenStream(lex);\n" +
      "        <createParser>\n"+
      "     parser.setBuildParseTree(true);\n" +
      "     <profile>\n"+
      "        ParserRuleContext tree = parser.<parserStartRuleName>();\n" +
      "     <if(profile)>System.out.println(Arrays.toString(profiler.getDecisionInfo()));<endif>\n" +
      "        ParseTreeWalker.DEFAULT.walk(new TreeShapeListener(), tree);\n" +
      "    }\n" +
      "\n" +
      "  static class TreeShapeListener implements ParseTreeListener {\n" +
      "    @Override public void visitTerminal(TerminalNode node) { }\n" +
      "    @Override public void visitErrorNode(ErrorNode node) { }\n" +
      "    @Override public void exitEveryRule(ParserRuleContext ctx) { }\n" +
      "\n" +
      "    @Override\n" +
      "    public void enterEveryRule(ParserRuleContext ctx) {\n" +
      "      for (int i = 0; i \\< ctx.getChildCount(); i++) {\n" +
      "        ParseTree parent = ctx.getChild(i).getParent();\n" +
      "        if (!(parent instanceof RuleNode) || ((RuleNode)parent).getRuleContext() != ctx) {\n" +
      "          throw new IllegalStateException(\"Invalid parse tree shape detected.\");\n" +
      "        }\n" +
      "      }\n" +
      "    }\n" +
      "  }\n" +
      "}"
      );
        ST createParserST = new ST("        <parserName> parser = new <parserName>(tokens);\n");
    if ( debug ) {
      createParserST =
        new ST(
        "        <parserName> parser = new <parserName>(tokens);\n" +
                "        parser.addErrorListener(new DiagnosticErrorListener());\n");
    }
    if ( profile ) {
      outputFileST.add("profile",
View Full Code Here

    outputFileST.add("parserStartRuleName", parserStartRuleName);
    writeFile(tmpdir, "Test.java", outputFileST.render());
  }

  protected void writeLexerTestFile(String lexerName, boolean showDFA) {
    ST outputFileST = new ST(
      "import org.antlr.v4.runtime.*;\n" +
      "\n" +
      "public class Test {\n" +
      "    public static void main(String[] args) throws Exception {\n" +
      "        CharStream input = new ANTLRFileStream(args[0]);\n" +
      "        <lexerName> lex = new <lexerName>(input);\n" +
      "        CommonTokenStream tokens = new CommonTokenStream(lex);\n" +
      "        tokens.fill();\n" +
      "        for (Object t : tokens.getTokens()) System.out.println(t);\n" +
      (showDFA?"System.out.print(lex.getInterpreter().getDFA(Lexer.DEFAULT_MODE).toLexerString());\n":"")+
      "    }\n" +
      "}"
      );

    outputFileST.add("lexerName", lexerName);
    writeFile(tmpdir, "Test.java", outputFileST.render());
  }
View Full Code Here

      "error(" + ErrorType.LOCAL_CONFLICTS_WITH_RETVAL.code + "): T.g4:3:12: local expr conflicts with return value with same name\n" +
      "error(" + ErrorType.LABEL_CONFLICTS_WITH_RULE.code + "): T.g4:4:4: label expr conflicts with rule with same name\n" +
      "error(" + ErrorType.LABEL_CONFLICTS_WITH_ARG.code + "): T.g4:4:4: label expr conflicts with parameter with same name\n" +
      "error(" + ErrorType.LABEL_CONFLICTS_WITH_RETVAL.code + "): T.g4:4:4: label expr conflicts with return value with same name\n" +
      "error(" + ErrorType.LABEL_CONFLICTS_WITH_LOCAL.code + "): T.g4:4:4: label expr conflicts with local with same name\n";
    ST grammarST = new ST(grammarTemplate);
    grammarST.add("args", "int expr");
    grammarST.add("retvals", "int expr");
    grammarST.add("locals", "int expr");
    grammarST.add("body", "expr=expr");
    testErrors(new String[] { grammarST.render(), expected }, false);
  }
View Full Code Here

      DFAState s,
      int k)
  {
    //System.out.println("walk "+s.stateNumber+" in dfa for decision "+dfa.decisionNumber);
    if ( s.isAcceptState() ) {
      ST dfaST = templates.getInstanceOf("dfaAcceptState");
      dfaST.add("alt", Utils.integer(s.getUniquelyPredictedAlt()));
      return dfaST;
    }

    // the default templates for generating a state and its edges
    // can be an if-then-else structure or a switch
    String dfaStateName = "dfaState";
    String dfaLoopbackStateName = "dfaLoopbackState";
    String dfaOptionalBlockStateName = "dfaOptionalBlockState";
    String dfaEdgeName = "dfaEdge";
    if ( parentGenerator.canGenerateSwitch(s) ) {
      dfaStateName = "dfaStateSwitch";
      dfaLoopbackStateName = "dfaLoopbackStateSwitch";
      dfaOptionalBlockStateName = "dfaOptionalBlockStateSwitch";
      dfaEdgeName = "dfaEdgeSwitch";
    }

    ST dfaST = templates.getInstanceOf(dfaStateName);
    if ( dfa.getNFADecisionStartState().decisionStateType==NFAState.LOOPBACK ) {
      dfaST = templates.getInstanceOf(dfaLoopbackStateName);
    }
    else if ( dfa.getNFADecisionStartState().decisionStateType==NFAState.OPTIONAL_BLOCK_START ) {
      dfaST = templates.getInstanceOf(dfaOptionalBlockStateName);
    }
    dfaST.add("k", Utils.integer(k));
    dfaST.add("stateNumber", Utils.integer(s.stateNumber));
    dfaST.add("semPredState", s.isResolvedWithPredicates());
    /*
    String description = dfa.getNFADecisionStartState().getDescription();
    description = parentGenerator.target.getTargetStringLiteralFromString(description);
    //System.out.println("DFA: "+description+" associated with AST "+dfa.getNFADecisionStartState());
    if ( description!=null ) {
      dfaST.add("description", description);
    }
    */
    int EOTPredicts = NFA.INVALID_ALT_NUMBER;
    DFAState EOTTarget = null;
    //System.out.println("DFA state "+s.stateNumber);
    for (int i = 0; i < s.getNumberOfTransitions(); i++) {
      Transition edge = s.transition(i);
      //System.out.println("edge "+s.stateNumber+"-"+edge.label.toString()+"->"+edge.target.stateNumber);
      if ( edge.label.getAtom()==Label.EOT ) {
        // don't generate a real edge for EOT; track alt EOT predicts
        // generate that prediction in the else clause as default case
        EOTTarget = (DFAState)edge.target;
        EOTPredicts = EOTTarget.getUniquelyPredictedAlt();
        /*
        System.out.println("DFA s"+s.stateNumber+" EOT goes to s"+
                   edge.target.stateNumber+" predicates alt "+
                   EOTPredicts);
        */
        continue;
      }
      ST edgeST = templates.getInstanceOf(dfaEdgeName);
      // If the template wants all the label values delineated, do that
      if ( edgeST.impl.formalArguments.get("labels")!=null ) {
        List<Integer> labels = edge.label.getSet().toList();
        List<String> targetLabels = new ArrayList<String>(labels.size());
        for (int j = 0; j < labels.size(); j++) {
          Integer vI = labels.get(j);
          String label =
            parentGenerator.getTokenTypeAsTargetLabel(vI);
          targetLabels.add(label); // rewrite List element to be name
        }
        edgeST.add("labels", targetLabels);
      }
      else { // else create an expression to evaluate (the general case)
        edgeST.add("labelExpr",
                  parentGenerator.genLabelExpr(templates,edge,k));
      }

      // stick in any gated predicates for any edge if not already a pred
      if ( !edge.label.isSemanticPredicate() ) {
        DFAState target = (DFAState)edge.target;
        SemanticContext preds =
          target.getGatedPredicatesInNFAConfigurations();
        if ( preds!=null ) {
          //System.out.println("preds="+target.getGatedPredicatesInNFAConfigurations());
          ST predST = preds.genExpr(parentGenerator,
                              parentGenerator.getTemplates(),
                              dfa);
          edgeST.add("predicates", predST);
        }
      }

      ST targetST =
        walkFixedDFAGeneratingStateMachine(templates,
                           dfa,
                           (DFAState)edge.target,
                           k+1);
      edgeST.add("targetState", targetST);
      dfaST.add("edges", edgeST);
      /*
      System.out.println("back to DFA "+
                 dfa.decisionNumber+"."+s.stateNumber);
                 */
    }

    // HANDLE EOT EDGE
    if ( EOTPredicts!=NFA.INVALID_ALT_NUMBER ) {
      // EOT unique predicts an alt
      dfaST.add("eotPredictsAlt", Utils.integer(EOTPredicts));
    }
    else if ( EOTTarget!=null && EOTTarget.getNumberOfTransitions()>0 ) {
      // EOT state has transitions so must split on predicates.
      // Generate predicate else-if clauses and then generate
      // NoViableAlt exception as else clause.
      // Note: these predicates emanate from the EOT target state
      // rather than the current DFAState s so the error message
      // might be slightly misleading if you are looking at the
      // state number.  Predicates emanating from EOT targets are
      // hoisted up to the state that has the EOT edge.
      for (int i = 0; i < EOTTarget.getNumberOfTransitions(); i++) {
        Transition predEdge = EOTTarget.transition(i);
        ST edgeST = templates.getInstanceOf(dfaEdgeName);
        edgeST.add("labelExpr",
                  parentGenerator.genSemanticPredicateExpr(templates,predEdge));
        // the target must be an accept state
        //System.out.println("EOT edge");
        ST targetST =
          walkFixedDFAGeneratingStateMachine(templates,
                             dfa,
                             (DFAState)predEdge.target,
                             k+1);
        edgeST.add("targetState", targetST);
View Full Code Here

        // add output vocab file; e.g., T.tokens. This is always generated to
        // the base output directory, which will be just . if there is no -o option
        //
    files.add(getOutputFile(generator.getVocabFileName()));
        // are we generating a .h file?
        ST headerExtST = null;
        ST extST = generator.getTemplates().getInstanceOf("codeFileExtension");
        if (generator.getTemplates().isDefined("headerFile")) {
            headerExtST = generator.getTemplates().getInstanceOf("headerFileExtension");
            String suffix = Grammar.getGrammarTypeToFileNameSuffix(g.getType());
            String fileName = g.name + suffix + headerExtST.render();
            files.add(getOutputFile(fileName));
        }
        if ( g.isCombined() ) {
            // add autogenerated lexer; e.g., TLexer.java TLexer.h TLexer.tokens

            String suffix = Grammar.getGrammarTypeToFileNameSuffix(ANTLRParser.LEXER);
            String lexer = g.name + suffix + extST.render();
            files.add(getOutputFile(lexer));
            String lexerTokens = g.name + suffix + CodeGenerator.VOCAB_FILE_EXTENSION;
            files.add(getOutputFile(lexerTokens));

            // TLexer.h
View Full Code Here

        return files;
    }

    public ST getDependencies() {
        loadDependencyTemplates();
        ST dependenciesST = templates.getInstanceOf("dependencies");
        dependenciesST.add("in", getDependenciesFileList());
        dependenciesST.add("out", getGeneratedFileList());
        dependenciesST.add("grammarFileName", g.fileName);
        return dependenciesST;
    }
View Full Code Here

     * </p>
     * @param message The message to send to Maven.
     */
    @Override
    public void error(ANTLRMessage message) {
        ST msgST = tool.errMgr.getMessageTemplate(message);
        String outputMsg = msgST.render();
        if (tool.errMgr.formatWantsSingleLineMessage()) {
            outputMsg = outputMsg.replace('\n', ' ');
        }

        log.error(outputMsg);
View Full Code Here

     * </p>
     * @param message
     */
    @Override
    public void warning(ANTLRMessage message) {
        ST msgST = tool.errMgr.getMessageTemplate(message);
        String outputMsg = msgST.render();
        if (tool.errMgr.formatWantsSingleLineMessage()) {
            outputMsg = outputMsg.replace('\n', ' ');
        }

        log.warn(outputMsg);
View Full Code Here

    setFileName(fileName);
    // ensure we have the composite set to something
    if ( composite.delegateGrammarTreeRoot==null ) {
      composite.setDelegationRoot(this);
    }
    STGroup lexerGrammarSTG = new STGroupString(lexerGrammarTemplate);
    lexerGrammarST = lexerGrammarSTG.getInstanceOf("grammar");
    target = CodeGenerator.loadLanguageTarget((String) getOption("language"));
  }
View Full Code Here

TOP

Related Classes of org.stringtemplate.v4.InstanceScope

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.