Class Target

java.lang.Object
org.antlr.v4.codegen.Target
Direct Known Subclasses:
CppTarget, CSharpTarget, DartTarget, GoTarget, JavaScriptTarget, JavaTarget, PHPTarget, Python2Target, Python3Target, SwiftTarget

public abstract class Target extends Object
  • Field Details

    • targetCharValueEscape

      protected String[] targetCharValueEscape
      For pure strings of Java 16-bit Unicode char, how can we display it in the target language as a literal. Useful for dumping predicates and such that may refer to chars that need to be escaped when represented as strings. Also, templates need to be escaped so that the target language can hold them as a string.

      I have defined (via the constructor) the set of typical escapes, but your Target subclass is free to alter the translated chars or add more definitions. This is non-static so each target can have a different set in memory at same time.

    • gen

      protected final CodeGenerator gen
  • Constructor Details

  • Method Details

    • getCodeGenerator

      public CodeGenerator getCodeGenerator()
    • getLanguage

      public String getLanguage()
    • getVersion

      public abstract String getVersion()
      ANTLR tool should check output templates / target are compatible with tool code generation. For now, a simple string match used on x.y of x.y.z scheme. We use a method to avoid mismatches between a template called VERSION. This value is checked against Tool.VERSION during load of templates. This additional method forces all targets 4.3 and beyond to add this method.
      Since:
      4.3
    • getTemplates

      public org.stringtemplate.v4.STGroup getTemplates()
    • genFile

      protected void genFile(Grammar g, org.stringtemplate.v4.ST outputFileST, String fileName)
    • getTokenTypeAsTargetLabel

      public String getTokenTypeAsTargetLabel(Grammar g, int ttype)
      Get a meaningful name for a token type useful during code generation. Literals without associated names are converted to the string equivalent of their integer values. Used to generate x==ID and x==34 type comparisons etc... Essentially we are looking for the most obvious way to refer to a token type in the generated code.
    • getTokenTypesAsTargetLabels

      public String[] getTokenTypesAsTargetLabels(Grammar g, int[] ttypes)
    • getTargetStringLiteralFromString

      public String getTargetStringLiteralFromString(String s, boolean quoted)
      Given a random string of Java unicode chars, return a new string with optionally appropriate quote characters for target language and possibly with some escaped characters. For example, if the incoming string has actual newline characters, the output of this method would convert them to the two char sequence \n for Java, C, C++, ... The new string has double-quotes around it as well. Example String in memory: a"[newlinechar]b'c[carriagereturnchar]d[tab]e\f would be converted to the valid Java s: "a\"\nb'c\rd\te\\f" or a\"\nb'c\rd\te\\f depending on the quoted arg.
    • appendUnicodeEscapedCodePoint

      protected abstract void appendUnicodeEscapedCodePoint(int codePoint, StringBuilder sb)
      Escape the Unicode code point appropriately for this language and append the escaped value to sb.
    • getTargetStringLiteralFromString

      public String getTargetStringLiteralFromString(String s)
    • getTargetStringLiteralFromANTLRStringLiteral

      public String getTargetStringLiteralFromANTLRStringLiteral(CodeGenerator generator, String literal, boolean addQuotes)

      Convert from an ANTLR string literal found in a grammar file to an equivalent string literal in the target language.

      For Java, this is the translation 'a\n"'"a\n\"". Expect single quotes around the incoming literal. Just flip the quotes and replace double quotes with \".

      Note that we have decided to allow people to use '\"' without penalty, so we must build the target string in a loop as String.replace(char, char) cannot handle both \" and " without a lot of messing around.

    • shouldUseUnicodeEscapeForCodePointInDoubleQuotedString

      protected boolean shouldUseUnicodeEscapeForCodePointInDoubleQuotedString(int codePoint)
    • encodeIntAsCharEscape

      public String encodeIntAsCharEscape(int v)
      Assume 16-bit char
    • getLoopLabel

      public String getLoopLabel(GrammarAST ast)
    • getLoopCounter

      public String getLoopCounter(GrammarAST ast)
    • getListLabel

      public String getListLabel(String label)
    • getRuleFunctionContextStructName

      public String getRuleFunctionContextStructName(Rule r)
    • getAltLabelContextStructName

      public String getAltLabelContextStructName(String label)
    • getRuleFunctionContextStructName

      public String getRuleFunctionContextStructName(RuleFunction function)
      If we know which actual function, we can provide the actual ctx type. This will contain implicit labels etc... From outside, though, we see only ParserRuleContext unless there are externally visible stuff like args, locals, explicit labels, etc...
    • getImplicitTokenLabel

      public String getImplicitTokenLabel(String tokenName)
    • getImplicitSetLabel

      public String getImplicitSetLabel(String id)
    • getImplicitRuleLabel

      public String getImplicitRuleLabel(String ruleName)
    • getElementListName

      public String getElementListName(String name)
    • getElementName

      public String getElementName(String name)
    • getRecognizerFileName

      public String getRecognizerFileName(boolean header)
      Generate TParser.java and TLexer.java from T.g4 if combined, else just use T.java as output regardless of type.
    • getListenerFileName

      public String getListenerFileName(boolean header)
      A given grammar T, return the listener name such as TListener.java, if we're using the Java target.
    • getVisitorFileName

      public String getVisitorFileName(boolean header)
      A given grammar T, return the visitor name such as TVisitor.java, if we're using the Java target.
    • getBaseListenerFileName

      public String getBaseListenerFileName(boolean header)
      A given grammar T, return a blank listener implementation such as TBaseListener.java, if we're using the Java target.
    • getBaseVisitorFileName

      public String getBaseVisitorFileName(boolean header)
      A given grammar T, return a blank listener implementation such as TBaseListener.java, if we're using the Java target.
    • getSerializedATNSegmentLimit

      public int getSerializedATNSegmentLimit()
      Gets the maximum number of 16-bit unsigned integers that can be encoded in a single segment of the serialized ATN.
      Returns:
      the serialized ATN segment limit
      See Also:
    • getInlineTestSetWordSize

      public int getInlineTestSetWordSize()
      How many bits should be used to do inline token type tests? Java assumes a 64-bit word for bitsets. Must be a valid wordsize for your target like 8, 16, 32, 64, etc...
      Since:
      4.5
    • grammarSymbolCausesIssueInGeneratedCode

      public boolean grammarSymbolCausesIssueInGeneratedCode(GrammarAST idNode)
    • visibleGrammarSymbolCausesIssueInGeneratedCode

      protected abstract boolean visibleGrammarSymbolCausesIssueInGeneratedCode(GrammarAST idNode)
    • templatesExist

      public boolean templatesExist()
    • loadTemplates

      protected org.stringtemplate.v4.STGroup loadTemplates()
    • wantsBaseListener

      public boolean wantsBaseListener()
      Since:
      4.3
    • wantsBaseVisitor

      public boolean wantsBaseVisitor()
      Since:
      4.3
    • supportsOverloadedMethods

      public boolean supportsOverloadedMethods()
      Since:
      4.3
    • needsHeader

      public boolean needsHeader()
      Since:
      4.6