From f22acf701eac16e51fa7d2f03c027a49a3c942d3 Mon Sep 17 00:00:00 2001 From: ericvergnaud Date: Thu, 16 Oct 2014 22:57:29 +0800 Subject: [PATCH] progress --- tool/test/org/antlr/v4/testgen/Generator.java | 117 +++++++++++++++++- .../grammars/ParserErrors/ConjuringUpToken.st | 2 + .../ParserErrors/ConjuringUpTokenFromSet.st | 2 + .../ParserErrors/ContextListGetters.st | 8 ++ .../DuplicatedLeftRecursiveCall.st | 6 + .../ParserErrors/InvalidATNStateRemoval.st | 6 + .../ParserErrors/InvalidEmptyInput.st | 4 + .../grammars/ParserErrors/LL1ErrorInfo.st | 14 +++ .../v4/testgen/grammars/ParserErrors/LL2.st | 5 + .../v4/testgen/grammars/ParserErrors/LL3.st | 5 + .../testgen/grammars/ParserErrors/LLStar.st | 5 + .../MultiTokenDeletionBeforeLoop.st | 2 + .../MultiTokenDeletionBeforeLoop2.st | 2 + .../MultiTokenDeletionDuringLoop.st | 2 + .../MultiTokenDeletionDuringLoop2.st | 2 + .../ParserErrors/NoViableAltAvoidance.st | 7 ++ .../ParserErrors/SingleSetInsertion.st | 2 + .../ParserErrors/SingleTokenDeletion.st | 2 + .../SingleTokenDeletionBeforeLoop.st | 2 + .../SingleTokenDeletionBeforeLoop2.st | 2 + .../SingleTokenDeletionDuringLoop.st | 2 + .../SingleTokenDeletionDuringLoop2.st | 2 + .../SingleTokenDeletionExpectingSet.st | 2 + .../ParserErrors/SingleTokenInsertion.st | 2 + .../grammars/ParserErrors/TokenMismatch.st | 2 + 25 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpToken.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpTokenFromSet.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ContextListGetters.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/DuplicatedLeftRecursiveCall.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidATNStateRemoval.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidEmptyInput.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL1ErrorInfo.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL2.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL3.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LLStar.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop2.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop2.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/NoViableAltAvoidance.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleSetInsertion.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletion.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop2.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop2.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionExpectingSet.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenInsertion.st create mode 100644 tool/test/org/antlr/v4/testgen/grammars/ParserErrors/TokenMismatch.st diff --git a/tool/test/org/antlr/v4/testgen/Generator.java b/tool/test/org/antlr/v4/testgen/Generator.java index f369b55e6..47c4274b3 100644 --- a/tool/test/org/antlr/v4/testgen/Generator.java +++ b/tool/test/org/antlr/v4/testgen/Generator.java @@ -105,16 +105,125 @@ public class Generator { private Collection buildTests() throws Exception { List list = new ArrayList(); - list.add(buildLexerExec()); - list.add(buildParserExec()); list.add(buildCompositeLexers()); list.add(buildCompositeParsers()); list.add(buildFullContextParsing()); list.add(buildLeftRecursion()); list.add(buildLexerErrors()); + list.add(buildLexerExec()); list.add(buildListeners()); - return list; - + list.add(buildParserErrors()); + list.add(buildParserExec()); + return list; + } + + private TestFile buildParserErrors() throws Exception { + TestFile file = new TestFile("ParserErrors"); + file.addParserTest(input, "TokenMismatch", "T", "a", + "aa", + "", + "line 1:1 mismatched input 'a' expecting 'b'\n"); + file.addParserTest(input, "SingleTokenDeletion", "T", "a", + "aab", + "", + "line 1:1 extraneous input 'a' expecting 'b'\n"); + file.addParserTest(input, "SingleTokenDeletionExpectingSet", "T", "a", + "aab", + "", + "line 1:1 extraneous input 'a' expecting {'b', 'c'}\n"); + file.addParserTest(input, "SingleTokenInsertion", "T", "a", + "ac", + "", + "line 1:1 missing 'b' at 'c'\n"); + file.addParserTest(input, "ConjuringUpToken", "T", "a", + "ac", + "conjured=[@-1,-1:-1='',<1>,1:1]\n", + null); + file.addParserTest(input, "SingleSetInsertion", "T", "a", + "ad", + "", + "line 1:1 missing {'b', 'c'} at 'd'\n"); + file.addParserTest(input, "ConjuringUpTokenFromSet", "T", "a", + "ad", + "conjured=[@-1,-1:-1='',<1>,1:1]\n", + null); + file.addParserTest(input, "LL2", "T", "a", + "ae", + "", + "line 1:1 no viable alternative at input 'ae'\n"); + file.addParserTest(input, "LL3", "T", "a", + "abe", + "", + "line 1:2 no viable alternative at input 'abe'\n"); + file.addParserTest(input, "LLStar", "T", "a", + "aaae", + "", + "line 1:3 no viable alternative at input 'aaae'\n"); + file.addParserTest(input, "SingleTokenDeletionBeforeLoop", "T", "a", + "aabc", + "", + "line 1:1 extraneous input 'a' expecting {, 'b'}\n" + + "line 1:3 token recognition error at: 'c'\n"); + file.addParserTest(input, "MultiTokenDeletionBeforeLoop", "T", "a", + "aacabc", + "", + "line 1:1 extraneous input 'a' expecting {'b', 'c'}\n"); + file.addParserTest(input, "SingleTokenDeletionDuringLoop", "T", "a", + "ababbc", + "", + "line 1:2 extraneous input 'a' expecting {'b', 'c'}\n"); + file.addParserTest(input, "MultiTokenDeletionDuringLoop", "T", "a", + "abaaababc", + "", + "line 1:2 extraneous input 'a' expecting {'b', 'c'}\n" + + "line 1:6 extraneous input 'a' expecting {'b', 'c'}\n"); + file.addParserTest(input, "SingleTokenDeletionBeforeLoop2", "T", "a", + "aabc", + "", + "line 1:1 extraneous input 'a' expecting {, 'b', 'z'}\n" + + "line 1:3 token recognition error at: 'c'\n"); + file.addParserTest(input, "MultiTokenDeletionBeforeLoop2", "T", "a", + "aacabc", + "", + "line 1:1 extraneous input 'a' expecting {'b', 'z', 'c'}\n"); + file.addParserTest(input, "SingleTokenDeletionDuringLoop2", "T", "a", + "ababbc", + "", + "line 1:2 extraneous input 'a' expecting {'b', 'z', 'c'}\n"); + file.addParserTest(input, "MultiTokenDeletionDuringLoop2", "T", "a", + "abaaababc", + "", + "line 1:2 extraneous input 'a' expecting {'b', 'z', 'c'}\n" + + "line 1:6 extraneous input 'a' expecting {'b', 'z', 'c'}\n"); + file.addParserTest(input, "LL1ErrorInfo", "T", "start", + "dog and software", + "{'hardware', 'software'}\n", + null); + file.addParserTest(input, "InvalidEmptyInput", "T", "start", + "", + "", + "line 1:0 missing ID at ''\n"); + file.addParserTest(input, "ContextListGetters", "T", "s", + "abab", + "abab\n", + null); + file.addParserTestsWithErrors(input, "DuplicatedLeftRecursiveCall", "T", "start", + "xx", "", null, + "xxx", "", null, + "xxxx", "", null); + file.addParserTest(input, "InvalidATNStateRemoval", "T", "start", + "x:x", + "", + null); + // "a." matches 'a' to rule e but then realizes '.' won't match. + // previously would cause noviablealt. now prediction pretends to + // have "a' predict 2nd alt of e. Will get syntax error later so + // let it get farther. + file.addParserTest(input, "NoViableAltAvoidance", "T", "s", + "a.", + "", + "line 1:1 mismatched input '.' expecting '!'\n"); + return file; } private TestFile buildListeners() throws Exception { diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpToken.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpToken.st new file mode 100644 index 000000000..d7259fee4 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpToken.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' x='b' {} 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpTokenFromSet.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpTokenFromSet.st new file mode 100644 index 000000000..e8f27a064 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ConjuringUpTokenFromSet.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' x=('b'|'c') {} 'd' ; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ContextListGetters.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ContextListGetters.st new file mode 100644 index 000000000..9d3d816aa --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/ContextListGetters.st @@ -0,0 +1,8 @@ +grammar ; +@parser::members{ + +} +s : (a | b)+; +a : 'a' {}; +b : 'b' {}; +; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/DuplicatedLeftRecursiveCall.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/DuplicatedLeftRecursiveCall.st new file mode 100644 index 000000000..04f71f413 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/DuplicatedLeftRecursiveCall.st @@ -0,0 +1,6 @@ +grammar ; +start : expr EOF; +expr : 'x' + | expr expr + ; +; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidATNStateRemoval.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidATNStateRemoval.st new file mode 100644 index 000000000..646d8162c --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidATNStateRemoval.st @@ -0,0 +1,6 @@ +grammar ; +start : ID ':' expr; +expr : primary expr? {} | expr '->' ID; +primary : ID; +ID : [a-z]+; +; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidEmptyInput.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidEmptyInput.st new file mode 100644 index 000000000..65551a8c6 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/InvalidEmptyInput.st @@ -0,0 +1,4 @@ +grammar ; +start : ID+; +ID : [a-z]+; +; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL1ErrorInfo.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL1ErrorInfo.st new file mode 100644 index 000000000..aec08f27d --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL1ErrorInfo.st @@ -0,0 +1,14 @@ +grammar ; +start : animal (AND acClass)? service EOF; +animal : (DOG | CAT ); +service : (HARDWARE | SOFTWARE) ; +AND : 'and'; +DOG : 'dog'; +CAT : 'cat'; +HARDWARE: 'hardware'; +SOFTWARE: 'software'; +WS : ' ' -> skip ; +acClass +@init +{} + : ; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL2.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL2.st new file mode 100644 index 000000000..a6ea5030b --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL2.st @@ -0,0 +1,5 @@ +grammar ; +a : 'a' 'b' + | 'a' 'c' +; +q : 'e' ; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL3.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL3.st new file mode 100644 index 000000000..412d44c02 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LL3.st @@ -0,0 +1,5 @@ +grammar ; +a : 'a' 'b'* 'c' + | 'a' 'b' 'd' +; +q : 'e' ; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LLStar.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LLStar.st new file mode 100644 index 000000000..bc2e46412 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/LLStar.st @@ -0,0 +1,5 @@ +grammar ; +a : 'a'+ 'b' + | 'a'+ 'c' +; +q : 'e' ; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop.st new file mode 100644 index 000000000..d1ee35ca9 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b'* 'c'; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop2.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop2.st new file mode 100644 index 000000000..7f322fede --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionBeforeLoop2.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'z'{})* 'c'; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop.st new file mode 100644 index 000000000..b7417c923 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b'* 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop2.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop2.st new file mode 100644 index 000000000..133e24091 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/MultiTokenDeletionDuringLoop2.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'z'{})* 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/NoViableAltAvoidance.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/NoViableAltAvoidance.st new file mode 100644 index 000000000..139e3ded2 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/NoViableAltAvoidance.st @@ -0,0 +1,7 @@ +grammar ; +s : e '!' ; +e : 'a' 'b' + | 'a' + ; +DOT : '.' ; +WS : [ \t\r\n]+ -> skip; diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleSetInsertion.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleSetInsertion.st new file mode 100644 index 000000000..d5f724b4a --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleSetInsertion.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'c') 'd' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletion.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletion.st new file mode 100644 index 000000000..daebfb144 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletion.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop.st new file mode 100644 index 000000000..c2b5d9037 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b'* ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop2.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop2.st new file mode 100644 index 000000000..ef412fd55 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionBeforeLoop2.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'z'{})*; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop.st new file mode 100644 index 000000000..b7417c923 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b'* 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop2.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop2.st new file mode 100644 index 000000000..133e24091 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionDuringLoop2.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'z'{})* 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionExpectingSet.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionExpectingSet.st new file mode 100644 index 000000000..6280f7599 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenDeletionExpectingSet.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' ('b'|'c') ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenInsertion.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenInsertion.st new file mode 100644 index 000000000..013403fce --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/SingleTokenInsertion.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b' 'c' ; \ No newline at end of file diff --git a/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/TokenMismatch.st b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/TokenMismatch.st new file mode 100644 index 000000000..daebfb144 --- /dev/null +++ b/tool/test/org/antlr/v4/testgen/grammars/ParserErrors/TokenMismatch.st @@ -0,0 +1,2 @@ +grammar ; +a : 'a' 'b' ; \ No newline at end of file