Added check for fragment rules.
This commit is contained in:
parent
f4c4e8b4a7
commit
64b2ced763
|
@ -413,9 +413,11 @@ public class TestSymbolIssues extends BaseJavaToolTest {
|
|||
"TOKEN6: 'asdf';\n" +
|
||||
"TOKEN7: 'qwer'+;\n" +
|
||||
"TOKEN8: 'a' 'b' | 'b' | 'a' 'b';\n" +
|
||||
"fragment\n" +
|
||||
"TOKEN9: 'asdf' | 'qwer' | 'qwer';\n" +
|
||||
"\n" +
|
||||
"mode MODE1;\n" +
|
||||
"TOKEN9: 'asdf';\n" +
|
||||
"TOKEN10: 'asdf';\n" +
|
||||
"\n" +
|
||||
"fragment A: 'A';",
|
||||
|
||||
|
@ -423,7 +425,8 @@ public class TestSymbolIssues extends BaseJavaToolTest {
|
|||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:5:0: One of the token TOKEN4 values unreachable. qwer is always overlapped by token TOKEN1\n" +
|
||||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:7:0: One of the token TOKEN6 values unreachable. asdf is always overlapped by token TOKEN1\n" +
|
||||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:7:0: One of the token TOKEN6 values unreachable. asdf is always overlapped by token TOKEN3\n" +
|
||||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:9:0: One of the token TOKEN8 values unreachable. ab is always overlapped by token TOKEN8\n"
|
||||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:9:0: One of the token TOKEN8 values unreachable. ab is always overlapped by token TOKEN8\n" +
|
||||
"warning(" + ErrorType.TOKEN_UNREACHABLE.code + "): Test.g4:11:0: One of the token TOKEN9 values unreachable. qwer is always overlapped by token TOKEN9\n"
|
||||
};
|
||||
|
||||
testErrors(test, false);
|
||||
|
|
|
@ -12,8 +12,6 @@ import org.antlr.v4.automata.LexerATNFactory;
|
|||
import org.antlr.v4.parse.ANTLRLexer;
|
||||
import org.antlr.v4.parse.ANTLRParser;
|
||||
import org.antlr.v4.runtime.Token;
|
||||
import org.antlr.v4.runtime.misc.IntervalSet;
|
||||
import org.antlr.v4.runtime.misc.MultiMap;
|
||||
import org.antlr.v4.tool.Alternative;
|
||||
import org.antlr.v4.tool.Attribute;
|
||||
import org.antlr.v4.tool.AttributeDict;
|
||||
|
@ -347,12 +345,10 @@ public class SymbolChecks {
|
|||
for (int i = 0; i < rules.size(); i++) {
|
||||
Rule rule = rules.get(i);
|
||||
|
||||
if (!rule.isFragment()) {
|
||||
List<String> ruleStringAlts = getSingleTokenValues(rule);
|
||||
if (ruleStringAlts != null && ruleStringAlts.size() > 0) {
|
||||
stringLiteralRules.add(rule);
|
||||
stringLiteralValues.add(ruleStringAlts);
|
||||
}
|
||||
List<String> ruleStringAlts = getSingleTokenValues(rule);
|
||||
if (ruleStringAlts != null && ruleStringAlts.size() > 0) {
|
||||
stringLiteralRules.add(rule);
|
||||
stringLiteralValues.add(ruleStringAlts);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -362,8 +358,14 @@ public class SymbolChecks {
|
|||
Rule rule1 = stringLiteralRules.get(i);
|
||||
checkForOverlap(g, rule1, rule1, firstTokenStringValues, stringLiteralValues.get(i));
|
||||
|
||||
for (int j = i + 1; j < stringLiteralRules.size(); j++) {
|
||||
checkForOverlap(g, rule1, stringLiteralRules.get(j), firstTokenStringValues, stringLiteralValues.get(j));
|
||||
// Check fragment rules only with themselfs
|
||||
if (!rule1.isFragment()) {
|
||||
for (int j = i + 1; j < stringLiteralRules.size(); j++) {
|
||||
Rule rule2 = stringLiteralRules.get(j);
|
||||
if (!rule2.isFragment()) {
|
||||
checkForOverlap(g, rule1, stringLiteralRules.get(j), firstTokenStringValues, stringLiteralValues.get(j));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue