|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.antlr.codegen.CodeGenerator
public class CodeGenerator
ANTLR's code generator. Generate recognizers derived from grammars. Language independence achieved through the use of StringTemplateGroup objects. All output strings are completely encapsulated in the group files such as Java.stg. Some computations are done that are unused by a particular language. This generator just computes and sets the values into the templates; the templates are free to use or not use the information. To make a new code generation target, define X.stg for language X by copying from existing Y.stg most closely releated to your language; e.g., to do CSharp.stg copy Java.stg. The template group file has a bunch of templates that are needed by the code generator. You can add a new target w/o even recompiling ANTLR itself. The language=X option in a grammar file dictates which templates get loaded/used. Some language like C need both parser files and header files. Java needs to have a separate file for the cyclic DFA as ANTLR generates bytecodes directly (which cannot be in the generated parser Java file). To facilitate this, cyclic can be in same file, but header, output must be searpate. recognizer is in outptufile.
Field Summary | |
---|---|
ACyclicDFACodeGenerator |
acyclicDFAGenerator
I have factored out the generation of acyclic DFAs to separate class |
protected StringTemplateGroup |
baseTemplates
The basic output templates without AST or templates stuff; this will be the templates loaded for the language such as Java.stg *and* the Dbg stuff if turned on. |
java.lang.String |
classpathTemplateRootDirectoryName
|
protected boolean |
debug
Generate debugging event method calls |
static boolean |
EMIT_TEMPLATE_DELIMITERS
|
static boolean |
GEN_ACYCLIC_DFA_INLINE
|
boolean |
GENERATE_SWITCHES_WHEN_POSSIBLE
|
Grammar |
grammar
Which grammar are we generating code for? Each generator is attached to a specific grammar. |
protected StringTemplate |
headerFileST
|
protected java.lang.String |
language
What language are we generating? |
protected int |
lineWidth
|
int |
MAX_SWITCH_CASE_LABELS
When generating SWITCH statements, some targets might need to limit the size (based upon the number of case labels). |
int |
MIN_SWITCH_ALTS
|
protected StringTemplate |
outputFileST
|
protected boolean |
profile
Track runtime parsing information about decisions etc... |
protected StringTemplate |
recognizerST
|
Target |
target
The target specifies how to write out files and do other language specific actions. |
protected StringTemplateGroup |
templates
Where are the templates this generator should use to generate code? |
protected Tool |
tool
A reference to the ANTLR tool so we can learn about output directories and such. |
protected boolean |
trace
Create a Tracer object and make the recognizer invoke this. |
protected int |
uniqueLabelNumber
Used to create unique labels |
static java.lang.String |
VOCAB_FILE_EXTENSION
I have factored out the generation of cyclic DFAs to separate class |
protected static java.lang.String |
vocabFilePattern
|
Constructor Summary | |
---|---|
CodeGenerator(Tool tool,
Grammar grammar,
java.lang.String language)
|
Method Summary | |
---|---|
protected boolean |
canGenerateSwitch(DFAState s)
You can generate a switch rather than if-then-else for a DFA state if there are no semantic predicates and the number of edge label values is small enough; e.g., don't generate a switch for a state containing an edge label such as 20..52330 (the resulting byte codes would overflow the method 65k limit probably). |
java.lang.String |
createUniqueLabel(java.lang.String name)
Create a label to track a token / rule reference's result. |
void |
generateLocalFOLLOW(GrammarAST referencedElementNode,
java.lang.String referencedElementName,
java.lang.String enclosingRuleName,
int elementIndex)
Error recovery in ANTLR recognizers. |
StringTemplate |
generateSpecialState(DFAState s)
A special state is huge (too big for state tables) or has a predicated edge. |
protected StringTemplate |
genLabelExpr(StringTemplateGroup templates,
Transition edge,
int k)
Generate an expression for traversing an edge. |
StringTemplate |
genLookaheadDecision(StringTemplate recognizerST,
DFA dfa)
Generate code that computes the predicted alt given a DFA. |
StringTemplate |
genRecognizer()
Given the grammar to which we are attached, walk the AST associated with that grammar to create NFAs. |
protected StringTemplate |
genSemanticPredicateExpr(StringTemplateGroup templates,
Transition edge)
|
StringTemplate |
genSetExpr(StringTemplateGroup templates,
IntSet set,
int k,
boolean partOfDFA)
For intervals such as [3..3, 30..35], generate an expression that tests the lookahead similar to LA(1)==3 || (LA(1)>=30&&LA(1)<=35) |
protected void |
genTokenTypeConstants(StringTemplate code)
Set attributes tokens and literals attributes in the incoming code template. |
protected void |
genTokenTypeNames(StringTemplate code)
Generate a token names table that maps token type to a printable name: either the label like INT or the literal like "begin". |
protected StringTemplate |
genTokenVocabOutput()
Generate a token vocab file with all the token names/types. |
StringTemplateGroup |
getBaseTemplates()
|
java.lang.String |
getRecognizerFileName(java.lang.String name,
int type)
|
StringTemplate |
getRecognizerST()
|
StringTemplateGroup |
getTemplates()
|
java.lang.String |
getTokenTypeAsTargetLabel(int ttype)
Get a meaningful name for a token type useful during code generation. |
java.lang.String |
getVocabFileName()
What is the name of the vocab file generated for this grammar? Returns null if no .tokens file should be generated. |
void |
issueInvalidAttributeError(java.lang.String x,
Rule enclosingRule,
antlr.Token actionToken,
int outerAltNum)
|
void |
issueInvalidAttributeError(java.lang.String x,
java.lang.String y,
Rule enclosingRule,
antlr.Token actionToken,
int outerAltNum)
|
void |
issueInvalidScopeError(java.lang.String x,
java.lang.String y,
Rule enclosingRule,
antlr.Token actionToken,
int outerAltNum)
|
protected void |
loadLanguageTarget(java.lang.String language)
|
void |
loadTemplates(java.lang.String language)
load the main language.stg template group file |
void |
setDebug(boolean debug)
|
void |
setProfile(boolean profile)
|
void |
setTrace(boolean trace)
|
java.util.List |
translateAction(java.lang.String ruleName,
GrammarAST actionTree)
|
protected void |
translateActionAttributeReferences(java.util.Map actions)
Actions may reference $x::y attributes, call translateAction on each action and replace that action in the Map. |
protected void |
translateActionAttributeReferencesForSingleScope(Rule r,
java.util.Map scopeActions)
Use for translating rule @init{...} actions that have no scope |
java.util.List |
translateArgAction(java.lang.String ruleName,
GrammarAST actionTree)
Translate an action like [3,"foo",a[3]] and return a List of the translated actions. |
StringTemplate |
translateTemplateConstructor(java.lang.String ruleName,
int outerAltNum,
antlr.Token actionToken,
java.lang.String templateActionText)
Given a template constructor action like %foo(a={...}) in an action, translate it to the appropriate template constructor from the templateLib. |
protected void |
verifyActionScopesOkForTarget(java.util.Map actions)
Some targets will have some extra scopes like C++ may have '@headerfile:name {action}' or something. |
void |
write(StringTemplate code,
java.lang.String fileName)
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public int MAX_SWITCH_CASE_LABELS
public int MIN_SWITCH_ALTS
public boolean GENERATE_SWITCHES_WHEN_POSSIBLE
public static boolean GEN_ACYCLIC_DFA_INLINE
public static boolean EMIT_TEMPLATE_DELIMITERS
public java.lang.String classpathTemplateRootDirectoryName
public Grammar grammar
protected java.lang.String language
public Target target
protected StringTemplateGroup templates
protected StringTemplateGroup baseTemplates
protected StringTemplate recognizerST
protected StringTemplate outputFileST
protected StringTemplate headerFileST
protected int uniqueLabelNumber
protected Tool tool
protected boolean debug
protected boolean trace
protected boolean profile
protected int lineWidth
public ACyclicDFACodeGenerator acyclicDFAGenerator
public static final java.lang.String VOCAB_FILE_EXTENSION
protected static final java.lang.String vocabFilePattern
Constructor Detail |
---|
public CodeGenerator(Tool tool, Grammar grammar, java.lang.String language)
Method Detail |
---|
protected void loadLanguageTarget(java.lang.String language)
public void loadTemplates(java.lang.String language)
public StringTemplate genRecognizer()
protected void verifyActionScopesOkForTarget(java.util.Map actions)
protected void translateActionAttributeReferences(java.util.Map actions)
protected void translateActionAttributeReferencesForSingleScope(Rule r, java.util.Map scopeActions)
public void generateLocalFOLLOW(GrammarAST referencedElementNode, java.lang.String referencedElementName, java.lang.String enclosingRuleName, int elementIndex)
public StringTemplate genLookaheadDecision(StringTemplate recognizerST, DFA dfa)
public StringTemplate generateSpecialState(DFAState s)
protected StringTemplate genLabelExpr(StringTemplateGroup templates, Transition edge, int k)
protected StringTemplate genSemanticPredicateExpr(StringTemplateGroup templates, Transition edge)
public StringTemplate genSetExpr(StringTemplateGroup templates, IntSet set, int k, boolean partOfDFA)
protected void genTokenTypeConstants(StringTemplate code)
protected void genTokenTypeNames(StringTemplate code)
public java.lang.String getTokenTypeAsTargetLabel(int ttype)
protected StringTemplate genTokenVocabOutput()
public java.util.List translateAction(java.lang.String ruleName, GrammarAST actionTree)
public java.util.List translateArgAction(java.lang.String ruleName, GrammarAST actionTree)
public StringTemplate translateTemplateConstructor(java.lang.String ruleName, int outerAltNum, antlr.Token actionToken, java.lang.String templateActionText)
public void issueInvalidScopeError(java.lang.String x, java.lang.String y, Rule enclosingRule, antlr.Token actionToken, int outerAltNum)
public void issueInvalidAttributeError(java.lang.String x, java.lang.String y, Rule enclosingRule, antlr.Token actionToken, int outerAltNum)
public void issueInvalidAttributeError(java.lang.String x, Rule enclosingRule, antlr.Token actionToken, int outerAltNum)
public StringTemplateGroup getTemplates()
public StringTemplateGroup getBaseTemplates()
public void setDebug(boolean debug)
public void setTrace(boolean trace)
public void setProfile(boolean profile)
public StringTemplate getRecognizerST()
public java.lang.String getRecognizerFileName(java.lang.String name, int type)
public java.lang.String getVocabFileName()
public void write(StringTemplate code, java.lang.String fileName) throws java.io.IOException
java.io.IOException
protected boolean canGenerateSwitch(DFAState s)
public java.lang.String createUniqueLabel(java.lang.String name)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |