public class ParserATNFactory extends Object implements ATNFactory
ATN
object and returns it.ATNFactory.Handle
Modifier and Type | Field and Description |
---|---|
ATN |
atn |
int |
currentOuterAlt |
Rule |
currentRule |
Grammar |
g |
protected List<Triple<Rule,ATNState,ATNState>> |
preventEpsilonClosureBlocks |
protected List<Triple<Rule,ATNState,ATNState>> |
preventEpsilonOptionalBlocks |
Constructor and Description |
---|
ParserATNFactory(Grammar g) |
Modifier and Type | Method and Description |
---|---|
protected void |
_createATN(Collection<Rule> rules) |
ATNFactory.Handle |
_ruleRef(GrammarAST node) |
ATNFactory.Handle |
action(ActionAST action)
Build what amounts to an epsilon transition with an action.
|
ATNFactory.Handle |
action(String action) |
int |
addEOFTransitionToStartRules()
Add an EOF transition to any rule end ATNState that points to nothing
(i.e., for all those rules not invoked by another rule).
|
void |
addFollowLink(int ruleIndex,
ATNState right) |
void |
addRuleFollowLinks() |
ATNFactory.Handle |
alt(List<ATNFactory.Handle> els) |
ATNFactory.Handle |
block(BlockAST blkAST,
GrammarAST ebnfRoot,
List<ATNFactory.Handle> alts)
From
A|B|..|Z alternative block build |
static boolean |
blockHasWildcardAlt(GrammarAST block)
(BLOCK (ALT .)) or (BLOCK (ALT 'a') (ALT .)) . |
ATNFactory.Handle |
charSetLiteral(GrammarAST charSetAST)
[Aa] char sets not allowed in parser |
ATN |
createATN() |
ATNFactory.Handle |
elemList(List<ATNFactory.Handle> els) |
protected void |
epsilon(ATNState a,
ATNState b) |
protected void |
epsilon(ATNState a,
ATNState b,
boolean prepend) |
ATNFactory.Handle |
epsilon(GrammarAST node)
From an empty alternative build
o-e->o . |
boolean |
expectNonGreedy(BlockAST blkAST) |
protected int |
getTokenType(GrammarAST atom) |
ATNFactory.Handle |
label(ATNFactory.Handle t) |
ATNFactory.Handle |
lexerAltCommands(ATNFactory.Handle alt,
ATNFactory.Handle cmds) |
ATNFactory.Handle |
lexerCallCommand(GrammarAST ID,
GrammarAST arg) |
ATNFactory.Handle |
lexerCommand(GrammarAST ID) |
ATNFactory.Handle |
listLabel(ATNFactory.Handle t) |
protected ATNFactory.Handle |
makeBlock(BlockStartState start,
BlockAST blkAST,
List<ATNFactory.Handle> alts) |
ATNState |
newState() |
<T extends ATNState> |
newState(Class<T> nodeType,
GrammarAST node) |
ATNState |
newState(GrammarAST node) |
ATNFactory.Handle |
optional(GrammarAST optAST,
ATNFactory.Handle blk)
From
(A)? build either: |
ATNFactory.Handle |
plus(GrammarAST plusAST,
ATNFactory.Handle blk)
From
(blk)+ build |
ATNFactory.Handle |
range(GrammarAST a,
GrammarAST b)
Not valid for non-lexers.
|
ATNFactory.Handle |
rule(GrammarAST ruleAST,
String name,
ATNFactory.Handle blk) |
ATNFactory.Handle |
ruleRef(GrammarAST node)
For reference to rule
r , build |
ATNFactory.Handle |
sempred(PredAST pred)
Build what amounts to an epsilon transition with a semantic
predicate action.
|
ATNFactory.Handle |
set(GrammarAST associatedAST,
List<GrammarAST> terminals,
boolean invert)
From set build single edge graph
o->o-set->o . |
void |
setCurrentOuterAlt(int alt) |
void |
setCurrentRuleName(String name) |
ATNFactory.Handle |
star(GrammarAST starAST,
ATNFactory.Handle elem)
From
(blk)* build ( blk+ )? with *two* decisions, one for
entry and one for choosing alts of blk . |
ATNFactory.Handle |
stringLiteral(TerminalAST stringLiteralAST)
For a non-lexer, just build a simple token reference atom.
|
ATNFactory.Handle |
tokenRef(TerminalAST node)
From label
A build graph o-A->o . |
ATNFactory.Handle |
wildcard(GrammarAST node)
Build an atom with all possible values in its label.
|
public final Grammar g
public final ATN atn
public Rule currentRule
public int currentOuterAlt
protected final List<Triple<Rule,ATNState,ATNState>> preventEpsilonClosureBlocks
public ParserATNFactory(Grammar g)
public ATN createATN()
createATN
in interface ATNFactory
protected void _createATN(Collection<Rule> rules)
public void setCurrentRuleName(String name)
setCurrentRuleName
in interface ATNFactory
public void setCurrentOuterAlt(int alt)
setCurrentOuterAlt
in interface ATNFactory
public ATNFactory.Handle rule(GrammarAST ruleAST, String name, ATNFactory.Handle blk)
rule
in interface ATNFactory
public ATNFactory.Handle tokenRef(TerminalAST node)
A
build graph o-A->o
.tokenRef
in interface ATNFactory
public ATNFactory.Handle set(GrammarAST associatedAST, List<GrammarAST> terminals, boolean invert)
o->o-set->o
. To conform to
what an alt block looks like, must have extra state on left.
This also handles ~A
, converted to ~{A}
set.set
in interface ATNFactory
public ATNFactory.Handle range(GrammarAST a, GrammarAST b)
range
in interface ATNFactory
protected int getTokenType(GrammarAST atom)
public ATNFactory.Handle stringLiteral(TerminalAST stringLiteralAST)
stringLiteral
in interface ATNFactory
public ATNFactory.Handle charSetLiteral(GrammarAST charSetAST)
[Aa]
char sets not allowed in parsercharSetLiteral
in interface ATNFactory
public ATNFactory.Handle ruleRef(GrammarAST node)
r
, build
o->(r) owhere
(r)
is the start of rule r
and the trailing
o
is not linked to from rule ref state directly (uses
RuleTransition.followState
).ruleRef
in interface ATNFactory
public ATNFactory.Handle _ruleRef(GrammarAST node)
public void addFollowLink(int ruleIndex, ATNState right)
public ATNFactory.Handle epsilon(GrammarAST node)
o-e->o
.epsilon
in interface ATNFactory
public ATNFactory.Handle sempred(PredAST pred)
pred
is a pointer into the AST of
the ANTLRParser.SEMPRED
token.sempred
in interface ATNFactory
public ATNFactory.Handle action(ActionAST action)
actionIndex
<0
.action
in interface ATNFactory
public ATNFactory.Handle action(String action)
action
in interface ATNFactory
public ATNFactory.Handle block(BlockAST blkAST, GrammarAST ebnfRoot, List<ATNFactory.Handle> alts)
A|B|..|Z
alternative block build
o->o-A->o->o (last ATNState is BlockEndState pointed to by all alts) | ^ |->o-B->o--| | | ... | | | |->o-Z->o--|So start node points at every alternative with epsilon transition and every alt right side points at a block end ATNState.
Special case: only one alternative: don't make a block with alt begin/end.
Special case: if just a list of tokens/chars/sets, then collapse to a single edged o-set->o graph.
TODO: Set alt number (1..n) in the states?
block
in interface ATNFactory
protected ATNFactory.Handle makeBlock(BlockStartState start, BlockAST blkAST, List<ATNFactory.Handle> alts)
public ATNFactory.Handle alt(List<ATNFactory.Handle> els)
alt
in interface ATNFactory
public ATNFactory.Handle elemList(List<ATNFactory.Handle> els)
public ATNFactory.Handle optional(GrammarAST optAST, ATNFactory.Handle blk)
(A)?
build either:
o--A->o | ^ o---->|or, if
A
is a block, just add an empty alt to the end of the
blockoptional
in interface ATNFactory
public ATNFactory.Handle plus(GrammarAST plusAST, ATNFactory.Handle blk)
(blk)+
build
|---------| v | [o-blk-o]->o->oWe add a decision for loop back node to the existing one at
blk
start.plus
in interface ATNFactory
public ATNFactory.Handle star(GrammarAST starAST, ATNFactory.Handle elem)
(blk)*
build ( blk+ )?
with *two* decisions, one for
entry and one for choosing alts of blk
.
|-------------| v | o--[o-blk-o]->o o | ^ -----------------|Note that the optional bypass must jump outside the loop as
(A|B)*
is not the same thing as (A|B|)+
.star
in interface ATNFactory
public ATNFactory.Handle wildcard(GrammarAST node)
wildcard
in interface ATNFactory
public void addRuleFollowLinks()
public int addEOFTransitionToStartRules()
public ATNFactory.Handle label(ATNFactory.Handle t)
label
in interface ATNFactory
public ATNFactory.Handle listLabel(ATNFactory.Handle t)
listLabel
in interface ATNFactory
public <T extends ATNState> T newState(Class<T> nodeType, GrammarAST node)
public ATNState newState(GrammarAST node)
public ATNState newState()
newState
in interface ATNFactory
public boolean expectNonGreedy(BlockAST blkAST)
public static boolean blockHasWildcardAlt(GrammarAST block)
(BLOCK (ALT .))
or (BLOCK (ALT 'a') (ALT .))
.public ATNFactory.Handle lexerAltCommands(ATNFactory.Handle alt, ATNFactory.Handle cmds)
lexerAltCommands
in interface ATNFactory
public ATNFactory.Handle lexerCallCommand(GrammarAST ID, GrammarAST arg)
lexerCallCommand
in interface ATNFactory
public ATNFactory.Handle lexerCommand(GrammarAST ID)
lexerCommand
in interface ATNFactory
Copyright © 1992–2020 ANTLR. All rights reserved.