Search in sources :

Example 76 with ST

use of edu.princeton.cs.algs4.ST in project antlr4 by tunnelvisionlabs.

the class OutputModelWalker method walk.

public ST walk(OutputModelObject omo, boolean header) {
    // CREATE TEMPLATE FOR THIS OUTPUT OBJECT
    Class<? extends OutputModelObject> cl = omo.getClass();
    String templateName = cl.getSimpleName();
    if (templateName == null) {
        tool.errMgr.toolError(ErrorType.NO_MODEL_TO_TEMPLATE_MAPPING, cl.getSimpleName());
        return new ST("[" + templateName + " invalid]");
    }
    if (header)
        templateName += "Header";
    ST st = templates.getInstanceOf(templateName);
    if (st == null) {
        tool.errMgr.toolError(ErrorType.CODE_GEN_TEMPLATES_INCOMPLETE, templateName);
        return new ST("[" + templateName + " invalid]");
    }
    if (st.impl.formalArguments == null) {
        tool.errMgr.toolError(ErrorType.CODE_TEMPLATE_ARG_ISSUE, templateName, "<none>");
        return st;
    }
    Map<String, FormalArgument> formalArgs = st.impl.formalArguments;
    // PASS IN OUTPUT MODEL OBJECT TO TEMPLATE AS FIRST ARG
    Set<String> argNames = formalArgs.keySet();
    Iterator<String> arg_it = argNames.iterator();
    // ordered so this is first arg
    String modelArgName = arg_it.next();
    st.add(modelArgName, omo);
    // COMPUTE STs FOR EACH NESTED MODEL OBJECT MARKED WITH @ModelElement AND MAKE ST ATTRIBUTE
    Set<String> usedFieldNames = new HashSet<String>();
    Field[] fields = cl.getFields();
    for (Field fi : fields) {
        ModelElement annotation = fi.getAnnotation(ModelElement.class);
        if (annotation == null) {
            continue;
        }
        String fieldName = fi.getName();
        if (!usedFieldNames.add(fieldName)) {
            tool.errMgr.toolError(ErrorType.INTERNAL_ERROR, "Model object " + omo.getClass().getSimpleName() + " has multiple fields named '" + fieldName + "'");
            continue;
        }
        // Just don't set @ModelElement fields w/o formal arg in target ST
        if (formalArgs.get(fieldName) == null)
            continue;
        try {
            Object o = fi.get(omo);
            if (o instanceof OutputModelObject) {
                // SINGLE MODEL OBJECT?
                OutputModelObject nestedOmo = (OutputModelObject) o;
                ST nestedST = walk(nestedOmo, header);
                // System.out.println("set ModelElement "+fieldName+"="+nestedST+" in "+templateName);
                st.add(fieldName, nestedST);
            } else if (o instanceof Collection || o instanceof OutputModelObject[]) {
                // LIST OF MODEL OBJECTS?
                if (o instanceof OutputModelObject[]) {
                    o = Arrays.asList((OutputModelObject[]) o);
                }
                Collection<?> nestedOmos = (Collection<?>) o;
                for (Object nestedOmo : nestedOmos) {
                    if (nestedOmo == null)
                        continue;
                    ST nestedST = walk((OutputModelObject) nestedOmo, header);
                    // System.out.println("set ModelElement "+fieldName+"="+nestedST+" in "+templateName);
                    st.add(fieldName, nestedST);
                }
            } else if (o instanceof Map<?, ?>) {
                Map<?, ?> nestedOmoMap = (Map<?, ?>) o;
                Map<Object, ST> m = new LinkedHashMap<Object, ST>();
                for (Map.Entry<?, ?> entry : nestedOmoMap.entrySet()) {
                    ST nestedST = walk((OutputModelObject) entry.getValue(), header);
                    // System.out.println("set ModelElement "+fieldName+"="+nestedST+" in "+templateName);
                    m.put(entry.getKey(), nestedST);
                }
                st.add(fieldName, m);
            } else if (o != null) {
                tool.errMgr.toolError(ErrorType.INTERNAL_ERROR, "not recognized nested model element: " + fieldName);
            }
        } catch (IllegalAccessException iae) {
            tool.errMgr.toolError(ErrorType.CODE_TEMPLATE_ARG_ISSUE, templateName, fieldName);
        }
    }
    // st.impl.dump();
    return st;
}
Also used : ST(org.stringtemplate.v4.ST) OutputModelObject(org.antlr.v4.codegen.model.OutputModelObject) LinkedHashMap(java.util.LinkedHashMap) FormalArgument(org.stringtemplate.v4.compiler.FormalArgument) Field(java.lang.reflect.Field) ModelElement(org.antlr.v4.codegen.model.ModelElement) Collection(java.util.Collection) OutputModelObject(org.antlr.v4.codegen.model.OutputModelObject) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) HashSet(java.util.HashSet)

Example 77 with ST

use of edu.princeton.cs.algs4.ST in project antlr4 by tunnelvisionlabs.

the class Target method getListenerFileName.

/**
 * A given grammar T, return the listener name such as
 *  TListener.java, if we're using the Java target.
 */
public String getListenerFileName(boolean header) {
    assert gen.g.name != null;
    ST extST = getTemplates().getInstanceOf("codeFileExtension");
    String listenerName = gen.g.name + "Listener";
    return listenerName + extST.render();
}
Also used : GrammarAST(org.antlr.v4.tool.ast.GrammarAST) ST(org.stringtemplate.v4.ST)

Example 78 with ST

use of edu.princeton.cs.algs4.ST in project antlr4 by tunnelvisionlabs.

the class Target method getBaseListenerFileName.

/**
 * A given grammar T, return a blank listener implementation
 *  such as TBaseListener.java, if we're using the Java target.
 */
public String getBaseListenerFileName(boolean header) {
    assert gen.g.name != null;
    ST extST = getTemplates().getInstanceOf("codeFileExtension");
    String listenerName = gen.g.name + "BaseListener";
    return listenerName + extST.render();
}
Also used : GrammarAST(org.antlr.v4.tool.ast.GrammarAST) ST(org.stringtemplate.v4.ST)

Example 79 with ST

use of edu.princeton.cs.algs4.ST in project antlr4 by tunnelvisionlabs.

the class Target method getRecognizerFileName.

/**
 * Generate TParser.java and TLexer.java from T.g4 if combined, else
 *  just use T.java as output regardless of type.
 */
public String getRecognizerFileName(boolean header) {
    ST extST = getTemplates().getInstanceOf("codeFileExtension");
    String recognizerName = gen.g.getRecognizerName();
    return recognizerName + extST.render();
}
Also used : GrammarAST(org.antlr.v4.tool.ast.GrammarAST) ST(org.stringtemplate.v4.ST)

Example 80 with ST

use of edu.princeton.cs.algs4.ST in project antlr4 by tunnelvisionlabs.

the class Target method getVisitorFileName.

/**
 * A given grammar T, return the visitor name such as
 *  TVisitor.java, if we're using the Java target.
 */
public String getVisitorFileName(boolean header) {
    assert gen.g.name != null;
    ST extST = getTemplates().getInstanceOf("codeFileExtension");
    String listenerName = gen.g.name + "Visitor";
    return listenerName + extST.render();
}
Also used : GrammarAST(org.antlr.v4.tool.ast.GrammarAST) ST(org.stringtemplate.v4.ST)

Aggregations

ST (org.stringtemplate.v4.ST)197 GrammarAST (org.antlr.v4.tool.ast.GrammarAST)37 STGroup (org.stringtemplate.v4.STGroup)24 File (java.io.File)19 ArrayList (java.util.ArrayList)16 IOException (java.io.IOException)12 STGroupFile (org.stringtemplate.v4.STGroupFile)12 Path (java.nio.file.Path)10 Test (org.junit.Test)10 ATNFactory (org.antlr.v4.automata.ATNFactory)9 LexerATNFactory (org.antlr.v4.automata.LexerATNFactory)9 ParserATNFactory (org.antlr.v4.automata.ParserATNFactory)9 CodeGenerator (org.antlr.v4.codegen.CodeGenerator)9 SemanticPipeline (org.antlr.v4.semantics.SemanticPipeline)9 Grammar (org.antlr.v4.tool.Grammar)9 LexerGrammar (org.antlr.v4.tool.LexerGrammar)9 STGroupString (org.stringtemplate.v4.STGroupString)9 LinkedHashMap (java.util.LinkedHashMap)7 URL (java.net.URL)6 Map (java.util.Map)6