Package org.antlr.tool
Class Rule
- java.lang.Object
-
- org.antlr.tool.Rule
-
public class Rule extends Object
Combine the info associated with a rule.
-
-
Field Summary
Fields Modifier and Type Field Description protected Map<String,Object>
actions
Map a name to an action for this rule.protected Map<String,List<GrammarAST>>[]
altToRuleRefMap
Each alt has a Map<ruleRefName,List<ruleRefAST>>; range 1..numberOfAlts So, if there are 3 expr refs in a rule's alt number 2, you'll have altToRuleRef[2].get("expr").size()==3.protected Map<String,List<GrammarAST>>[]
altToTokenRefMap
Each alt has a Map<tokenRefName,List<tokenRefAST>>; range 1..numberOfAlts.GrammarAST
argActionAST
For convenience, track the argument def AST action node if anyLinkedHashMap<String,Grammar.LabelElementPair>
charLabels
A list of all LabelElementPair attached to single char literals like x='a'GrammarAST
EORNode
Grammar
grammar
To which grammar does this belong?boolean
imported
int
index
protected List<GrammarAST>
inlineActions
Track all executable actions other than named actions like @init.boolean
isSynPred
protected Map<String,Grammar.LabelElementPair>
labelNameSpace
All labels go in here (plus being split per the above lists) to catch dup label and label type mismatches.static Set<String>
legalOptions
String
modifier
String
name
int
numberOfAlts
protected Map<String,Object>
options
This rule's optionsAttributeScope
parameterScope
boolean
referencedPredefinedRuleAttributes
Do not generate start, stop etc...AttributeScope
returnScope
The return values of a rule and predefined rule attributesLinkedHashMap<String,Grammar.LabelElementPair>
ruleLabels
A list of all LabelElementPair attached to rule references like f=fieldLinkedHashMap<String,Grammar.LabelElementPair>
ruleListLabels
A list of all rule ref list LabelElementPair like ids+=exprAttributeScope
ruleScope
the attributes defined with "scope {...}" inside a ruleNFAState
startState
NFAState
stopState
static boolean
supportsLabelOptimization
Set<String>
throwsSpec
Exceptions that this rule can throwLinkedHashMap<String,Grammar.LabelElementPair>
tokenLabels
A list of all LabelElementPair attached to tokens like id=IDLinkedHashMap<String,Grammar.LabelElementPair>
tokenListLabels
A list of all Token list LabelElementPair like ids+=IDGrammarAST
tree
The AST representing the whole ruleList<String>
useScopes
A list of scope names (String) used by this ruleLinkedHashMap<String,Grammar.LabelElementPair>
wildcardTreeLabels
A list of all LabelElementPair attached to tokens like x=.LinkedHashMap<String,Grammar.LabelElementPair>
wildcardTreeListLabels
A list of all LabelElementPair attached to tokens like x+=.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
defineLabel(org.antlr.runtime.Token label, GrammarAST elementRef, int type)
void
defineNamedAction(GrammarAST ampersandAST, GrammarAST nameAST, GrammarAST actionAST)
Given @scope::name {action} define it for this grammar.Map<String,Object>
getActions()
Set<String>
getAllRuleRefsInAltsWithRewrites()
For use with rewrite rules, we must track all rule AST results on the left-hand-side; so we need Lists.Set<String>
getAllTokenRefsInAltsWithRewrites()
For use with rewrite rules, we must track all tokens matched on the left-hand-side; so we need Lists.AttributeScope
getAttributeScope(String name)
Return the scope containing nameString
getElementLabel(String refdSymbol, int outerAltNum, CodeGenerator generator)
For references to tokens rather than by label such as $ID, we need to get the existing label for the ID ref or create a new one.boolean
getHasMultipleReturnValues()
If a rule has no user-defined return values and nobody references it's start/stop (predefined attributes), then there is no need to define a struct; otherwise for now we assume a struct.boolean
getHasReturnValue()
boolean
getHasSingleReturnValue()
List<GrammarAST>
getInlineActions()
Grammar.LabelElementPair
getLabel(String name)
AttributeScope
getLocalAttributeScope(String name)
Get the arg, return value, or predefined property for this ruleGrammar.LabelElementPair
getRuleLabel(String name)
Map<String,Grammar.LabelElementPair>
getRuleLabels()
Grammar.LabelElementPair
getRuleListLabel(String name)
Map<String,Grammar.LabelElementPair>
getRuleListLabels()
Set<String>
getRuleRefsInAlt(int outerAltNum)
List<GrammarAST>
getRuleRefsInAlt(String ref, int outerAltNum)
static int
getRuleType(String ruleName)
String
getSingleValueReturnName()
String
getSingleValueReturnType()
Grammar.LabelElementPair
getTokenLabel(String name)
Grammar.LabelElementPair
getTokenListLabel(String name)
Set<String>
getTokenRefsInAlt(int altNum)
List<GrammarAST>
getTokenRefsInAlt(String ref, int outerAltNum)
boolean
hasRewrite(int i)
void
setActions(Map<String,Object> actions)
String
setOption(String key, Object value, org.antlr.runtime.Token optionsStartToken)
Save the option key/value pair and process it; return the key or null if invalid option.void
setOptions(Map<String,Object> options, org.antlr.runtime.Token optionsStartToken)
String
toString()
Used during grammar imports to see if sets of rules intersect...void
trackInlineAction(GrammarAST actionAST)
void
trackRuleReferenceInAlt(GrammarAST refAST, int outerAltNum)
void
trackTokenReferenceInAlt(GrammarAST refAST, int outerAltNum)
Track a token ID or literal like '+' and "void" as having been referenced somewhere within the alts (not rewrite sections) of a rule.
-
-
-
Field Detail
-
supportsLabelOptimization
public static final boolean supportsLabelOptimization
-
name
public String name
-
index
public int index
-
modifier
public String modifier
-
startState
public NFAState startState
-
stopState
public NFAState stopState
-
tree
public GrammarAST tree
The AST representing the whole rule
-
grammar
public Grammar grammar
To which grammar does this belong?
-
argActionAST
public GrammarAST argActionAST
For convenience, track the argument def AST action node if any
-
EORNode
public GrammarAST EORNode
-
returnScope
public AttributeScope returnScope
The return values of a rule and predefined rule attributes
-
parameterScope
public AttributeScope parameterScope
-
ruleScope
public AttributeScope ruleScope
the attributes defined with "scope {...}" inside a rule
-
tokenLabels
public LinkedHashMap<String,Grammar.LabelElementPair> tokenLabels
A list of all LabelElementPair attached to tokens like id=ID
-
wildcardTreeLabels
public LinkedHashMap<String,Grammar.LabelElementPair> wildcardTreeLabels
A list of all LabelElementPair attached to tokens like x=. in tree grammar
-
wildcardTreeListLabels
public LinkedHashMap<String,Grammar.LabelElementPair> wildcardTreeListLabels
A list of all LabelElementPair attached to tokens like x+=. in tree grammar
-
charLabels
public LinkedHashMap<String,Grammar.LabelElementPair> charLabels
A list of all LabelElementPair attached to single char literals like x='a'
-
ruleLabels
public LinkedHashMap<String,Grammar.LabelElementPair> ruleLabels
A list of all LabelElementPair attached to rule references like f=field
-
tokenListLabels
public LinkedHashMap<String,Grammar.LabelElementPair> tokenListLabels
A list of all Token list LabelElementPair like ids+=ID
-
ruleListLabels
public LinkedHashMap<String,Grammar.LabelElementPair> ruleListLabels
A list of all rule ref list LabelElementPair like ids+=expr
-
labelNameSpace
protected Map<String,Grammar.LabelElementPair> labelNameSpace
All labels go in here (plus being split per the above lists) to catch dup label and label type mismatches.
-
actions
protected Map<String,Object> actions
Map a name to an action for this rule. Currently init is only one we use, but we can add more in future. The code generator will use this to fill holes in the rule template. I track the AST node for the action in case I need the line number for errors. A better name is probably namedActions, but I don't want everyone to have to change their code gen templates now.
-
inlineActions
protected List<GrammarAST> inlineActions
Track all executable actions other than named actions like @init. Also tracks exception handlers, predicates, and rewrite rewrites. We need to examine these actions before code generation so that we can detect refs to $rule.attr etc...
-
numberOfAlts
public int numberOfAlts
-
altToTokenRefMap
protected Map<String,List<GrammarAST>>[] altToTokenRefMap
Each alt has a Map<tokenRefName,List<tokenRefAST>>; range 1..numberOfAlts. So, if there are 3 ID refs in a rule's alt number 2, you'll have altToTokenRef[2].get("ID").size()==3. This is used to see if $ID is ok. There must be only one ID reference in the alt for $ID to be ok in an action--must be unique. This also tracks '+' and "int" literal token references (if not in LEXER). Rewrite rules force tracking of all tokens.
-
altToRuleRefMap
protected Map<String,List<GrammarAST>>[] altToRuleRefMap
Each alt has a Map<ruleRefName,List<ruleRefAST>>; range 1..numberOfAlts So, if there are 3 expr refs in a rule's alt number 2, you'll have altToRuleRef[2].get("expr").size()==3. This is used to see if $expr is ok. There must be only one expr reference in the alt for $expr to be ok in an action--must be unique. Rewrite rules force tracking of all rule result ASTs. 1..n
-
referencedPredefinedRuleAttributes
public boolean referencedPredefinedRuleAttributes
Do not generate start, stop etc... in a return value struct unless somebody references $r.start somewhere.
-
isSynPred
public boolean isSynPred
-
imported
public boolean imported
-
-
Method Detail
-
getRuleType
public static int getRuleType(String ruleName)
-
defineLabel
public void defineLabel(org.antlr.runtime.Token label, GrammarAST elementRef, int type)
-
getLabel
public Grammar.LabelElementPair getLabel(String name)
-
getTokenLabel
public Grammar.LabelElementPair getTokenLabel(String name)
-
getRuleLabels
public Map<String,Grammar.LabelElementPair> getRuleLabels()
-
getRuleListLabels
public Map<String,Grammar.LabelElementPair> getRuleListLabels()
-
getRuleLabel
public Grammar.LabelElementPair getRuleLabel(String name)
-
getTokenListLabel
public Grammar.LabelElementPair getTokenListLabel(String name)
-
getRuleListLabel
public Grammar.LabelElementPair getRuleListLabel(String name)
-
trackTokenReferenceInAlt
public void trackTokenReferenceInAlt(GrammarAST refAST, int outerAltNum)
Track a token ID or literal like '+' and "void" as having been referenced somewhere within the alts (not rewrite sections) of a rule. This differs from Grammar.altReferencesTokenID(), which tracks all token IDs to check for token IDs without corresponding lexer rules.
-
getTokenRefsInAlt
public List<GrammarAST> getTokenRefsInAlt(String ref, int outerAltNum)
-
trackRuleReferenceInAlt
public void trackRuleReferenceInAlt(GrammarAST refAST, int outerAltNum)
-
getRuleRefsInAlt
public List<GrammarAST> getRuleRefsInAlt(String ref, int outerAltNum)
-
getAllTokenRefsInAltsWithRewrites
public Set<String> getAllTokenRefsInAltsWithRewrites()
For use with rewrite rules, we must track all tokens matched on the left-hand-side; so we need Lists. This is a unique list of all token types for which the rule needs a list of tokens. This is called from the rule template not directly by the code generator.
-
getAllRuleRefsInAltsWithRewrites
public Set<String> getAllRuleRefsInAltsWithRewrites()
For use with rewrite rules, we must track all rule AST results on the left-hand-side; so we need Lists. This is a unique list of all rule results for which the rule needs a list of results.
-
getInlineActions
public List<GrammarAST> getInlineActions()
-
hasRewrite
public boolean hasRewrite(int i)
-
getAttributeScope
public AttributeScope getAttributeScope(String name)
Return the scope containing name
-
getLocalAttributeScope
public AttributeScope getLocalAttributeScope(String name)
Get the arg, return value, or predefined property for this rule
-
getElementLabel
public String getElementLabel(String refdSymbol, int outerAltNum, CodeGenerator generator)
For references to tokens rather than by label such as $ID, we need to get the existing label for the ID ref or create a new one.
-
getHasMultipleReturnValues
public boolean getHasMultipleReturnValues()
If a rule has no user-defined return values and nobody references it's start/stop (predefined attributes), then there is no need to define a struct; otherwise for now we assume a struct. A rule also has multiple return values if you are building trees or templates.
-
getHasSingleReturnValue
public boolean getHasSingleReturnValue()
-
getHasReturnValue
public boolean getHasReturnValue()
-
getSingleValueReturnType
public String getSingleValueReturnType()
-
getSingleValueReturnName
public String getSingleValueReturnName()
-
defineNamedAction
public void defineNamedAction(GrammarAST ampersandAST, GrammarAST nameAST, GrammarAST actionAST)
Given @scope::name {action} define it for this grammar. Later, the code generator will ask for the actions table.
-
trackInlineAction
public void trackInlineAction(GrammarAST actionAST)
-
setOption
public String setOption(String key, Object value, org.antlr.runtime.Token optionsStartToken)
Save the option key/value pair and process it; return the key or null if invalid option.
-
setOptions
public void setOptions(Map<String,Object> options, org.antlr.runtime.Token optionsStartToken)
-
-