Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ dependencies {
api("org.antlr", "antlr-runtime", "3.5.3")
api("org.antlr", "ST4", "4.3.4")
compileOnly("com.ibm.icu", "icu4j", "58.3")
compileOnly("com.github.spotbugs", "spotbugs-annotations", "4.9.8")
implementation("org.abego.treelayout", "org.abego.treelayout.core", "1.0.3")

testImplementation("org.junit.jupiter", "junit-jupiter-api", "5.11.4")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
import org.antlr.v4.parse.LeftRecursiveRuleWalker;
import org.antlr.v4.runtime.misc.IntervalSet;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.misc.Tuple;
import org.antlr.v4.runtime.misc.Pair;
import org.antlr.v4.runtime.misc.Tuple;
import org.antlr.v4.tool.ErrorType;
import org.antlr.v4.tool.ast.AltAST;
import org.antlr.v4.tool.ast.GrammarAST;
Expand Down
16 changes: 8 additions & 8 deletions src/main/java/org/antlr/v4/automata/ATNOptimizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ private static void optimizeSets(Grammar g, ATN atn) {
continue;
}

ATNState blockEndState = decision.transition(interval.a).target.transition(0).target;
ATNState blockEndState = decision.transition(interval.a()).target.transition(0).target;
IntervalSet matchSet = new IntervalSet();
for (int j = interval.a; j <= interval.b; j++) {
for (int j = interval.a(); j <= interval.b(); j++) {
Transition matchTransition = decision.transition(j).target.transition(0);
if (matchTransition instanceof NotSetTransition) {
throw new UnsupportedOperationException("Not yet implemented.");
Expand All @@ -103,8 +103,8 @@ private static void optimizeSets(Grammar g, ATN atn) {
List<Interval> intervals = set.getIntervals();
int n = intervals.size();
for (Interval setInterval : intervals) {
int a = setInterval.a;
int b = setInterval.b;
int a = setInterval.a();
int b = setInterval.b();
if (a != -1 && b != -1) {
for (int v = a; v <= b; v++) {
if (matchSet.contains(v)) {
Expand All @@ -127,15 +127,15 @@ private static void optimizeSets(Grammar g, ATN atn) {
newTransition = CodePointTransitions.createWithCodePoint(blockEndState, matchSet.getMinElement());
} else {
Interval matchInterval = matchSet.getIntervals().get(0);
newTransition = CodePointTransitions.createWithCodePointRange(blockEndState, matchInterval.a, matchInterval.b);
newTransition = CodePointTransitions.createWithCodePointRange(blockEndState, matchInterval.a(), matchInterval.b());
}
} else {
newTransition = new SetTransition(blockEndState, matchSet);
}

decision.transition(interval.a).target.setTransition(0, newTransition);
for (int j = interval.a + 1; j <= interval.b; j++) {
Transition removed = decision.removeTransition(interval.a + 1);
decision.transition(interval.a()).target.setTransition(0, newTransition);
for (int j = interval.a() + 1; j <= interval.b(); j++) {
Transition removed = decision.removeTransition(interval.a() + 1);
atn.removeState(removed.target);
removedStates++;
}
Expand Down
36 changes: 24 additions & 12 deletions src/main/java/org/antlr/v4/automata/LexerATNFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ public static Set<String> getCommonConstants() {
return COMMON_CONSTANTS.keySet();
}

@NotNull
@Override
public ATN createATN() {
// BUILD ALL START STATES (ONE PER MODE)
Expand Down Expand Up @@ -152,14 +153,16 @@ public ATN createATN() {
return atn;
}

@NotNull
@Override
public Handle rule(GrammarAST ruleAST, String name, Handle blk) {
public Handle rule(@NotNull GrammarAST ruleAST, @NotNull String name, @NotNull Handle blk) {
ruleCommands.clear();
return super.rule(ruleAST, name, blk);
}

@NotNull
@Override
public Handle action(ActionAST action) {
public Handle action(@NotNull ActionAST action) {
int ruleIndex = currentRule.index;
int actionIndex = g.lexerActions.get(action);
LexerCustomAction lexerAction = new LexerCustomAction(ruleIndex, actionIndex);
Expand All @@ -177,8 +180,9 @@ protected int getLexerActionIndex(LexerAction lexerAction) {
return lexerActionIndex;
}

@NotNull
@Override
public Handle action(String action) {
public Handle action(@NotNull String action) {
if (action.trim().isEmpty()) {
ATNState left = newState(null);
ATNState right = newState(null);
Expand All @@ -203,15 +207,17 @@ protected Handle action(GrammarAST node, LexerAction lexerAction) {
return new Handle(left, right);
}

@NotNull
@Override
public Handle lexerAltCommands(Handle alt, Handle cmds) {
public Handle lexerAltCommands(@NotNull Handle alt, @NotNull Handle cmds) {
Handle h = new Handle(alt.left, cmds.right);
epsilon(alt.right, cmds.left);
return h;
}

@NotNull
@Override
public Handle lexerCallCommand(GrammarAST ID, GrammarAST arg) {
public Handle lexerCallCommand(@NotNull GrammarAST ID, @NotNull GrammarAST arg) {
LexerAction lexerAction = createLexerAction(ID, arg);
if (lexerAction != null) {
return action(ID, lexerAction);
Expand Down Expand Up @@ -241,8 +247,9 @@ public Handle lexerCallCommand(GrammarAST ID, GrammarAST arg) {
return action(cmdST.render());
}

@NotNull
@Override
public Handle lexerCommand(GrammarAST ID) {
public Handle lexerCommand(@NotNull GrammarAST ID) {
LexerAction lexerAction = createLexerAction(ID, null);
if (lexerAction != null) {
return action(ID, lexerAction);
Expand Down Expand Up @@ -270,8 +277,9 @@ public Handle lexerCommand(GrammarAST ID) {
return action(cmdST.render());
}

@NotNull
@Override
public Handle range(GrammarAST a, GrammarAST b) {
public Handle range(@NotNull GrammarAST a, @NotNull GrammarAST b) {
ATNState left = newState(a);
ATNState right = newState(b);
int t1 = CharSupport.getCharValueFromGrammarCharLiteral(a.getText());
Expand All @@ -284,8 +292,9 @@ public Handle range(GrammarAST a, GrammarAST b) {
return new Handle(left, right);
}

@NotNull
@Override
public Handle set(GrammarAST associatedAST, List<GrammarAST> alts, boolean invert) {
public Handle set(@NotNull GrammarAST associatedAST, @NotNull List<GrammarAST> alts, boolean invert) {
ATNState left = newState(associatedAST);
ATNState right = newState(associatedAST);
IntervalSet set = new IntervalSet();
Expand Down Expand Up @@ -317,7 +326,7 @@ public Handle set(GrammarAST associatedAST, List<GrammarAST> alts, boolean inver
Transition transition;
if (set.getIntervals().size() == 1) {
Interval interval = set.getIntervals().get(0);
transition = CodePointTransitions.createWithCodePointRange(right, interval.a, interval.b);
transition = CodePointTransitions.createWithCodePointRange(right, interval.a(), interval.b());
} else {
transition = new SetTransition(right, set);
}
Expand Down Expand Up @@ -358,8 +367,9 @@ protected boolean checkRange(GrammarAST leftNode, GrammarAST rightNode, int left
* if "caseInsensitive" option is enabled, "fog" will be treated as
* o-('f'|'F') -> o-('o'|'O') -> o-('g'|'G')
*/
@NotNull
@Override
public Handle stringLiteral(TerminalAST stringLiteralAST) {
public Handle stringLiteral(@NotNull TerminalAST stringLiteralAST) {
String chars = stringLiteralAST.getText();
ATNState left = newState(stringLiteralAST);
ATNState right;
Expand All @@ -386,8 +396,9 @@ public Handle stringLiteral(TerminalAST stringLiteralAST) {
/**
* [Aa\t \u1234a-z\]\p{Letter}\-] char sets
*/
@NotNull
@Override
public Handle charSetLiteral(GrammarAST charSetAST) {
public Handle charSetLiteral(@NotNull GrammarAST charSetAST) {
ATNState left = newState(charSetAST);
ATNState right = newState(charSetAST);
IntervalSet set = getSetFromCharSetLiteral(charSetAST);
Expand Down Expand Up @@ -642,8 +653,9 @@ private Transition createTransition(ATNState target, int from, int to, CommonTre
}
}

@NotNull
@Override
public Handle tokenRef(TerminalAST node) {
public Handle tokenRef(@NotNull TerminalAST node) {
// Ref to EOF in lexer yields char transition on -1
if (node.getText().equals("EOF")) {
ATNState left = newState(node);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/antlr/v4/codegen/model/LL1AltBlock.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public LL1AltBlock(OutputModelFactory factory, GrammarAST blkAST, List<CodeBlock
super(factory, blkAST, alts);
this.decision = ((DecisionState) blkAST.atnState).decision;

/** Lookahead for each alt 1..n */
// Lookahead for each alt 1..n
IntervalSet[] altLookSets = factory.getGrammar().decisionLOOK.get(decision);
altLook = getAltLookaheadAsStringLists(altLookSets);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ public LL1OptionalBlockSingleAlt(OutputModelFactory factory,
super(factory, blkAST, alts);
this.decision = ((DecisionState) blkAST.atnState).decision;

/** Lookahead for each alt 1..n */
// IntervalSet[] altLookSets = LinearApproximator.getLL1LookaheadSets(dfa);
// Lookahead for each alt 1..n
IntervalSet[] altLookSets = factory.getGrammar().decisionLOOK.get(decision);
altLook = getAltLookaheadAsStringLists(altLookSets);
IntervalSet look = altLookSets[0];
Expand Down
23 changes: 13 additions & 10 deletions src/main/java/org/antlr/v4/codegen/target/JavaTarget.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.antlr.v4.codegen.Target;
import org.antlr.v4.codegen.UnicodeEscapes;
import org.antlr.v4.misc.CharSupport;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.tool.ast.GrammarAST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.StringRenderer;
Expand Down Expand Up @@ -85,13 +86,14 @@ protected void addBadWords() {
public String getTargetStringLiteralFromANTLRStringLiteral(
CodeGenerator generator,
String literal, boolean addQuotes) {
StringBuilder sb = new StringBuilder();
String is = literal;
var sb = new StringBuilder();

if (addQuotes) sb.append('"');
if (addQuotes) {
sb.append('"');
}

for (int i = 1; i < is.length() - 1; ) {
int codePoint = is.codePointAt(i);
for (int i = 1; i < literal.length() - 1; ) {
int codePoint = literal.codePointAt(i);
int toAdvance = Character.charCount(codePoint);
if (codePoint == '\\') {
// Anything escaped is what it is! We assume that
Expand All @@ -100,7 +102,7 @@ public String getTargetStringLiteralFromANTLRStringLiteral(
// is what the default implementation is dealing with and remove
// the escape. The C target does this for instance.
//
int escapedCodePoint = is.codePointAt(i + toAdvance);
int escapedCodePoint = literal.codePointAt(i + toAdvance);
toAdvance++;
switch (escapedCodePoint) {
// Pass through any escapes that Java also needs
Expand All @@ -117,16 +119,16 @@ public String getTargetStringLiteralFromANTLRStringLiteral(
break;

case 'u': // Either unnnn or u{nnnnnn}
if (is.charAt(i + toAdvance) == '{') {
while (is.charAt(i + toAdvance) != '}') {
if (literal.charAt(i + toAdvance) == '{') {
while (literal.charAt(i + toAdvance) != '}') {
toAdvance++;
}
toAdvance++;
} else {
toAdvance += 4;
}
if (i + toAdvance <= is.length()) { // we might have an invalid \\uAB or something
String fullEscape = is.substring(i, i + toAdvance);
if (i + toAdvance <= literal.length()) { // we might have an invalid \\uAB or something
String fullEscape = literal.substring(i, i + toAdvance);
appendUnicodeEscapedCodePoint(
CharSupport.getCharValueFromCharInGrammarLiteral(fullEscape),
sb);
Expand Down Expand Up @@ -194,6 +196,7 @@ protected boolean visibleGrammarSymbolCausesIssueInGeneratedCode(GrammarAST idNo
return getBadWords().contains(idNode.getText());
}

@NotNull
@Override
protected STGroup loadTemplates() {
STGroup result = targetTemplates.get();
Expand Down
13 changes: 8 additions & 5 deletions src/main/java/org/antlr/v4/gui/TreeViewer.java
Original file line number Diff line number Diff line change
Expand Up @@ -157,11 +157,14 @@ protected void paintEdges(Graphics g, Tree parent) {
double y2 = childBounds.getMinY();
if (getUseCurvedEdges()) {
CubicCurve2D c = new CubicCurve2D.Double();
double ctrlx1 = x1;
double ctrly1 = (y1 + y2) / 2;
double ctrlx2 = x2;
double ctrly2 = y1;
c.setCurve(x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2);
c.setCurve(x1,
y1,
x1, // ctrlx1
(y1 + y2) / 2, // ctrly1
x2, // ctrlx2
y1, // ctrly2
x2,
y2);
((Graphics2D) g).draw(c);
} else {
g.drawLine((int) x1, (int) y1,
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/org/antlr/v4/gui/Trees.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ public static void save(Tree t, @Nullable Parser parser, String fileName,
/**
* Save this tree in a postscript file
*/
public static void save(Tree t, @Nullable List<String> ruleNames, String fileName)
throws IOException, PrintException {
public static void save(Tree t, @Nullable List<String> ruleNames, String fileName) throws IOException {
writePS(t, ruleNames, fileName);
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/antlr/v4/misc/CharSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public static String getIntervalSetEscapedString(IntervalSet intervalSet) {
Iterator<Interval> iter = intervalSet.getIntervals().iterator();
while (iter.hasNext()) {
Interval interval = iter.next();
buf.append(getRangeEscapedString(interval.a, interval.b));
buf.append(getRangeEscapedString(interval.a(), interval.b()));
if (iter.hasNext()) {
buf.append(" | ");
}
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/org/antlr/v4/parse/ANTLRLexer.g
Original file line number Diff line number Diff line change
Expand Up @@ -666,12 +666,12 @@ UNICODE_ESC
{
if (hCount < 4) {
Interval badRange = Interval.of(getCharIndex()-2-hCount, getCharIndex());
String lastChar = input.substring(badRange.b, badRange.b);
String lastChar = input.substring(badRange.b(), badRange.b());
if ( lastChar.codePointAt(0)=='\'' ) {
badRange = new Interval(badRange.a, badRange.b - 1);
badRange = new Interval(badRange.a(), badRange.b() - 1);
}
String bad = input.substring(badRange.a, badRange.b);
Token t = new CommonToken(input, state.type, state.channel, badRange.a, badRange.b);
String bad = input.substring(badRange.a(), badRange.b());
Token t = new CommonToken(input, state.type, state.channel, badRange.a(), badRange.b());
t.setLine(input.getLine());
t.setCharPositionInLine(input.getCharPositionInLine()-hCount-2);
grammarError(ErrorType.INVALID_ESCAPE_SEQUENCE, t, bad);
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/org/antlr/v4/parse/ANTLRLexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2885,12 +2885,12 @@ public final void mUNICODE_ESC() throws RecognitionException {
if (state.backtracking == 0) {
if (hCount < 4) {
Interval badRange = Interval.of(getCharIndex() - 2 - hCount, getCharIndex());
String lastChar = input.substring(badRange.b, badRange.b);
String lastChar = input.substring(badRange.b(), badRange.b());
if (lastChar.codePointAt(0) == '\'') {
badRange = new Interval(badRange.a, badRange.b - 1);
badRange = new Interval(badRange.a(), badRange.b() - 1);
}
String bad = input.substring(badRange.a, badRange.b);
Token t = new CommonToken(input, state.type, state.channel, badRange.a, badRange.b);
String bad = input.substring(badRange.a(), badRange.b());
Token t = new CommonToken(input, state.type, state.channel, badRange.a(), badRange.b());
t.setLine(input.getLine());
t.setCharPositionInLine(input.getCharPositionInLine() - hCount - 2);
grammarError(ErrorType.INVALID_ESCAPE_SEQUENCE, t, bad);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/antlr/v4/parse/GrammarASTAdaptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public GrammarAST create(Token token) {
}

@Override
/** Make sure even imaginary nodes know the input stream */
// Make sure even imaginary nodes know the input stream
public GrammarAST create(int tokenType, String text) {
GrammarAST t;
if (tokenType == ANTLRParser.RULE) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/antlr/v4/runtime/ANTLRFileStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void load(@NotNull String fileName, @Nullable String encoding)
this.n = data.length;
}

@NotNull
@Override
public String getSourceName() {
return fileName;
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/org/antlr/v4/runtime/ANTLRInputStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
package org.antlr.v4.runtime;

import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.misc.NotNull;

import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -210,16 +211,18 @@ public void seek(int index) {
}
}

@NotNull
@Override
public String getText(Interval interval) {
int start = interval.a;
int stop = interval.b;
public String getText(@NotNull Interval interval) {
int start = interval.a();
int stop = interval.b();
if (stop >= n) stop = n - 1;
int count = stop - start + 1;
if (start >= n) return "";
return new String(data, start, count);
}

@NotNull
@Override
public String getSourceName() {
if (name == null || name.isEmpty()) {
Expand Down
Loading