Java 类org.antlr.v4.runtime.atn.AtomTransition 实例源码
项目:codebuff
文件:LexerATNFactory.java
/** For a lexer, a string is a sequence of char to match. That is,
* "fog" is treated as 'f' 'o' 'g' not as a single transition in
* the DFA. Machine== o-'f'->o-'o'->o-'g'->o and has n+1 states
* for n characters.
*/
@Override
public Handle stringLiteral(TerminalAST stringLiteralAST) {
String chars = stringLiteralAST.getText();
chars = CharSupport.getStringFromGrammarStringLiteral(chars);
int n = chars.length();
ATNState left = newState(stringLiteralAST);
ATNState prev = left;
ATNState right = null;
for (int i=0; i<n; i++) {
right = newState(stringLiteralAST);
prev.addTransition(new AtomTransition(right, chars.charAt(i)));
prev = right;
}
stringLiteralAST.atnState = left;
return new Handle(left, right);
}
项目:codebuff
文件:LexerATNFactory.java
@Override
public Handle tokenRef(TerminalAST node) {
// Ref to EOF in lexer yields char transition on -1
if ( node.getText().equals("EOF") ) {
ATNState left = newState(node);
ATNState right = newState(node);
left.addTransition(new AtomTransition(right, IntStream.EOF));
return new Handle(left, right);
}
return _ruleRef(node);
}
项目:codebuff
文件:ParserATNFactory.java
/** From label {@code A} build graph {@code o-A->o}. */
@Override
public Handle tokenRef(TerminalAST node) {
ATNState left = newState(node);
ATNState right = newState(node);
int ttype = g.getTokenType(node.getText());
left.addTransition(new AtomTransition(right, ttype));
node.atnState = left;
return new Handle(left, right);
}
项目:codebuff
文件:ParserATNFactory.java
/** Add an EOF transition to any rule end ATNState that points to nothing
* (i.e., for all those rules not invoked by another rule). These
* are start symbols then.
*
* Return the number of grammar entry points; i.e., how many rules are
* not invoked by another rule (they can only be invoked from outside).
* These are the start rules.
*/
public int addEOFTransitionToStartRules() {
int n = 0;
ATNState eofTarget = newState(null); // one unique EOF target for all rules
for (Rule r : g.rules.values()) {
ATNState stop = atn.ruleToStopState[r.index];
if ( stop.getNumberOfTransitions()>0 ) continue;
n++;
Transition t = new AtomTransition(eofTarget, Token.EOF);
stop.addTransition(t);
}
return n;
}
项目:goworks
文件:GroupHighlighterLexer.java
private static Transition createSetTransition(ATNState target, IntervalSet set) {
if (set.getIntervals().size() == 1) {
Interval interval = set.getIntervals().get(0);
if (interval.a == interval.b) {
return new AtomTransition(target, interval.a);
} else {
return new RangeTransition(target, interval.a, interval.b);
}
} else {
return new SetTransition(target, set);
}
}
项目:goworks
文件:TemplateLexer.java
private static Transition createSetTransition(ATNState target, IntervalSet set) {
if (set.getIntervals().size() == 1) {
Interval interval = set.getIntervals().get(0);
if (interval.a == interval.b) {
return new AtomTransition(target, interval.a);
} else {
return new RangeTransition(target, interval.a, interval.b);
}
} else {
return new SetTransition(target, set);
}
}
项目:antlrworks2
文件:GroupHighlighterLexer.java
private static Transition createSetTransition(ATNState target, IntervalSet set) {
if (set.getIntervals().size() == 1) {
Interval interval = set.getIntervals().get(0);
if (interval.a == interval.b) {
return new AtomTransition(target, interval.a);
} else {
return new RangeTransition(target, interval.a, interval.b);
}
} else {
return new SetTransition(target, set);
}
}
项目:antlrworks2
文件:TemplateLexer.java
private static Transition createSetTransition(ATNState target, IntervalSet set) {
if (set.getIntervals().size() == 1) {
Interval interval = set.getIntervals().get(0);
if (interval.a == interval.b) {
return new AtomTransition(target, interval.a);
} else {
return new RangeTransition(target, interval.a, interval.b);
}
} else {
return new SetTransition(target, set);
}
}
项目:goworks
文件:AbstractCompletionParserATNSimulator.java
@Override
public ATNState getReachableTarget(ATNConfig source, Transition trans, int ttype) {
if (ttype == CaretToken.CARET_TOKEN_TYPE) {
ATNState target = null;
if (trans instanceof AtomTransition) {
AtomTransition at = (AtomTransition)trans;
if (getWordlikeTokenTypes().contains(at.label)) {
target = at.target;
}
} else if (trans instanceof SetTransition) {
SetTransition st = (SetTransition)trans;
boolean not = trans instanceof NotSetTransition;
// TODO: this could probably be done with an intersects method?
for (int t : getWordlikeTokenTypes().toArray()) {
if (!not && st.set.contains(t) || not && !st.set.contains(t)) {
target = st.target;
break;
}
}
} else if (trans instanceof RangeTransition) {
RangeTransition rt = (RangeTransition)trans;
// TODO: there must be a better algorithm here :)
int[] wordlikeTokenTypes = getWordlikeTokenTypes().toArray();
int lb = Arrays.binarySearch(wordlikeTokenTypes, rt.from);
int ub = Arrays.binarySearch(wordlikeTokenTypes, rt.to);
if (lb >= 0 || ub >= 0 || lb != ub) {
target = rt.target;
}
} else if (trans instanceof WildcardTransition) {
target = trans.target;
}
if (caretTransitions == null) {
caretTransitions = new LinkedHashMap<>();
}
List<Transition> configTransitions = caretTransitions.get(source);
if (configTransitions == null) {
configTransitions = new ArrayList<>();
caretTransitions.put(source, configTransitions);
}
configTransitions.add(trans);
return target;
}
return super.getReachableTarget(source, trans, ttype);
}
项目:antlrworks2
文件:AbstractCompletionParserATNSimulator.java
@Override
public ATNState getReachableTarget(ATNConfig source, Transition trans, int ttype) {
if (ttype == CaretToken.CARET_TOKEN_TYPE) {
ATNState target = null;
if (trans instanceof AtomTransition) {
AtomTransition at = (AtomTransition)trans;
if (getWordlikeTokenTypes().contains(at.label)) {
target = at.target;
}
} else if (trans instanceof SetTransition) {
SetTransition st = (SetTransition)trans;
boolean not = trans instanceof NotSetTransition;
// TODO: this could probably be done with an intersects method?
for (int t : getWordlikeTokenTypes().toArray()) {
if (!not && st.set.contains(t) || not && !st.set.contains(t)) {
target = st.target;
break;
}
}
} else if (trans instanceof RangeTransition) {
RangeTransition rt = (RangeTransition)trans;
// TODO: there must be a better algorithm here :)
int[] wordlikeTokenTypes = getWordlikeTokenTypes().toArray();
int lb = Arrays.binarySearch(wordlikeTokenTypes, rt.from);
int ub = Arrays.binarySearch(wordlikeTokenTypes, rt.to);
if (lb >= 0 || ub >= 0 || lb != ub) {
target = rt.target;
}
} else if (trans instanceof WildcardTransition) {
target = trans.target;
}
if (caretTransitions == null) {
caretTransitions = new LinkedHashMap<>();
}
List<Transition> configTransitions = caretTransitions.get(source);
if (configTransitions == null) {
configTransitions = new ArrayList<>();
caretTransitions.put(source, configTransitions);
}
configTransitions.add(trans);
return target;
}
return super.getReachableTarget(source, trans, ttype);
}