/* * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. * Use of this file is governed by the BSD 3-clause license that * can be found in the LICENSE.txt file in the project root. */ package org.antlr.v4.test.runtime.descriptors; import org.antlr.v4.test.runtime.BaseParserTestDescriptor; import org.antlr.v4.test.runtime.CommentHasStringValue; public class SetsDescriptors { public static class CharSetLiteral extends BaseParserTestDescriptor { public String input = "A a B b"; /** A a B b */ @CommentHasStringValue public String output; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : (A {<writeln("$A.text")>})+ ; A : [AaBb] ; WS : (' '|'\n')+ -> skip ; */ @CommentHasStringValue public String grammar; } public static class ComplementSet extends BaseParserTestDescriptor { public String input = "a"; public String output = null; /** line 1:0 token recognition error at: 'a' line 1:1 missing {} at '<EOF>' */ @CommentHasStringValue public String errors; public String startRule = "parse"; public String grammarName = "T"; /** grammar T; parse : ~NEW_LINE; NEW_LINE: '\\r'? '\\n'; */ @CommentHasStringValue public String grammar; } public static class LexerOptionalSet extends BaseParserTestDescriptor { public String input = "ac"; public String output = "ac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : ('a'|'b')? 'c' ; */ @CommentHasStringValue public String grammar; } public static class LexerPlusSet extends BaseParserTestDescriptor { public String input = "abaac"; public String output = "abaac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : ('a'|'b')+ 'c' ; */ @CommentHasStringValue public String grammar; } public static class LexerStarSet extends BaseParserTestDescriptor { public String input = "abaac"; public String output = "abaac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : ('a'|'b')* 'c' ; */ @CommentHasStringValue public String grammar; } public static class NotChar extends BaseParserTestDescriptor { public String input = "x"; public String output = "x\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<writeln("$A.text")>} ; A : ~'b' ; */ @CommentHasStringValue public String grammar; } public static class NotCharSet extends BaseParserTestDescriptor { public String input = "x"; public String output = "x\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<writeln("$A.text")>} ; A : ~('b'|'c') ; */ @CommentHasStringValue public String grammar; } public static class NotCharSetWithLabel extends BaseParserTestDescriptor { public String input = "x"; public String output = "x\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<writeln("$A.text")>} ; A : h=~('b'|'c') ; */ @CommentHasStringValue public String grammar; } public static class NotCharSetWithRuleRef3 extends BaseParserTestDescriptor { public String input = "x"; public String output = "x\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<writeln("$A.text")>} ; A : ('a'|B) ; // this doesn't collapse to set but works fragment B : ~('a'|'c') ; */ @CommentHasStringValue public String grammar; } public static class OptionalLexerSingleElement extends BaseParserTestDescriptor { public String input = "bc"; public String output = "bc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : 'b'? 'c' ; */ @CommentHasStringValue public String grammar; } public static class OptionalSet extends BaseParserTestDescriptor { public String input = "ac"; public String output = "ac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : ('a'|'b')? 'c' {<InputText():writeln()>} ; */ @CommentHasStringValue public String grammar; } public static class OptionalSingleElement extends BaseParserTestDescriptor { public String input = "bc"; public String output = "bc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A? 'c' {<InputText():writeln()>} ; A : 'b' ; */ @CommentHasStringValue public String grammar; } public static class ParserNotSet extends BaseParserTestDescriptor { public String input = "zz"; public String output = "z\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : t=~('x'|'y') 'z' {<writeln("$t.text")>} ; */ @CommentHasStringValue public String grammar; } public static class ParserNotToken extends BaseParserTestDescriptor { public String input = "zz"; public String output = "zz\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : ~'x' 'z' {<InputText():writeln()>} ; */ @CommentHasStringValue public String grammar; } public static class ParserNotTokenWithLabel extends BaseParserTestDescriptor { public String input = "zz"; public String output = "z\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : t=~'x' 'z' {<writeln("$t.text")>} ; */ @CommentHasStringValue public String grammar; } public static class ParserSet extends BaseParserTestDescriptor { public String input = "x"; public String output = "x\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : t=('x'|'y') {<writeln("$t.text")>} ; */ @CommentHasStringValue public String grammar; } public static class PlusLexerSingleElement extends BaseParserTestDescriptor { public String input = "bbbbc"; public String output = "bbbbc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : 'b'+ 'c' ; */ @CommentHasStringValue public String grammar; } public static class PlusSet extends BaseParserTestDescriptor { public String input = "abaac"; public String output = "abaac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : ('a'|'b')+ 'c' {<InputText():writeln()>} ; */ @CommentHasStringValue public String grammar; } public static class RuleAsSet extends BaseParserTestDescriptor { public String input = "b"; public String output = "b\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a @after {<InputText():writeln()>} : 'a' | 'b' |'c' ; */ @CommentHasStringValue public String grammar; } public static class SeqDoesNotBecomeSet extends BaseParserTestDescriptor { public String input = "34"; public String output = "34\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : C {<InputText():writeln()>} ; fragment A : '1' | '2'; fragment B : '3' '4'; C : A | B; */ @CommentHasStringValue public String grammar; } public static abstract class StarLexerSingleElement extends BaseParserTestDescriptor { public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : A {<InputText():writeln()>} ; A : 'b'* 'c' ; */ @CommentHasStringValue public String grammar; } public static class StarLexerSingleElement_1 extends StarLexerSingleElement { public String input = "bbbbc"; public String output = "bbbbc\n"; } public static class StarLexerSingleElement_2 extends StarLexerSingleElement { public String input = "c"; public String output = "c\n"; } public static class StarSet extends BaseParserTestDescriptor { public String input = "abaac"; public String output = "abaac\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : ('a'|'b')* 'c' {<InputText():writeln()>} ; */ @CommentHasStringValue public String grammar; } public static class UnicodeUnescapedBMPSet extends BaseParserTestDescriptor { public String input = "a\u00E4\u3042\u4E9Cc"; public String output = "a\u00E4\u3042\u4E9Cc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS {<InputText():writeln()>} ; // These are actually not escaped -- Java passes the // raw unescaped Unicode values to the grammar compiler. LETTERS : ('a'|'\u00E4'|'\u4E9C'|'\u3042')* 'c'; */ @CommentHasStringValue public String grammar; } public static class UnicodeUnescapedBMPRangeSet extends BaseParserTestDescriptor { public String input = "a\u00E1\u00E4\u00E1\u00E2\u00E5d"; public String output = "a\u00E1\u00E4\u00E1\u00E2\u00E5d\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS* 'd' {<InputText():writeln()>} ; // These are actually not escaped -- Java passes the // raw unescaped Unicode values to the grammar compiler. LETTERS : ('a'|'\u00E0'..'\u00E5'); */ @CommentHasStringValue public String grammar; } public static class UnicodeEscapedBMPSet extends BaseParserTestDescriptor { public String input = "a\u00E4\u3042\u4E9Cc"; public String output = "a\u00E4\u3042\u4E9Cc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS {<InputText():writeln()>} ; // Note the double-backslash to avoid Java passing // unescaped values as part of the grammar. LETTERS : ('a'|'\\u00E4'|'\\u4E9C'|'\\u3042')* 'c'; */ @CommentHasStringValue public String grammar; } public static class UnicodeEscapedBMPRangeSet extends BaseParserTestDescriptor { public String input = "a\u00E1\u00E4\u00E1\u00E2\u00E5d"; public String output = "a\u00E1\u00E4\u00E1\u00E2\u00E5d\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS* 'd' {<InputText():writeln()>} ; // Note the double-backslash to avoid Java passing // unescaped values as part of the grammar. LETTERS : ('a'|'\\u00E0'..'\\u00E5'); */ @CommentHasStringValue public String grammar; } // TODO(bhamiltoncx): This needs to be an error, the V3 // runtime used by the tool doesn't really understand unescaped code points > // U+FFFF. // public static class UnicodeUnescapedSMPSet extends BaseParserTestDescriptor { // public String input = new StringBuilder() // .append("a") // .appendCodePoint(0x1D5C2) // .appendCodePoint(0x1D5CE) // .appendCodePoint(0x1D5BA) // .append("c") // .toString(); // public String output = new StringBuilder() // .append("a") // .appendCodePoint(0x1D5C2) // .appendCodePoint(0x1D5CE) // .appendCodePoint(0x1D5BA) // .append("c\n") // .toString(); // public String errors = null; // public String startRule = "a"; // public String grammarName = "T"; // /** // grammar T; // a : LETTERS {<InputText():writeln()>} ; // // These are actually not escaped -- Java passes the // // raw unescaped Unicode values to the grammar compiler. // // // // Each sequence is the UTF-16 encoding of a raw Unicode // // SMP code point. // LETTERS : ('a'|'\uD835\uDDBA'|'\uD835\uDDBE'|'\uD835\uDDC2'|'\uD835\uDDC8'|'\uD835\uDDCE')* 'c'; // */ // @CommentHasStringValue // public String grammar; // } public static class UnicodeEscapedSMPSet extends BaseParserTestDescriptor { public String input = new StringBuilder() .append("a") .appendCodePoint(0x1D5C2) .appendCodePoint(0x1D5CE) .appendCodePoint(0x1D5BA) .append("c") .toString(); public String output = new StringBuilder() .append("a") .appendCodePoint(0x1D5C2) .appendCodePoint(0x1D5CE) .appendCodePoint(0x1D5BA) .append("c\n") .toString(); public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS {<InputText():writeln()>} ; // Note the double-backslash to avoid Java passing // unescaped values as part of the grammar. LETTERS : ('a'|'\\u{1D5BA}'|'\\u{1D5BE}'|'\\u{1D5C2}'|'\\u{1D5C8}'|'\\u{1D5CE}')* 'c'; */ @CommentHasStringValue public String grammar; } // Turns out Tool.java uses ANTLR 3's runtime, which means it can't use // CodePointCharStream to understand unescaped code points > U+FFFF. // // TODO(bhamiltoncx): This needs to be an error, since we don't currently plan // to port Tool.java to use ANTLR 4's runtime. // public static class UnicodeUnescapedSMPRangeSet extends BaseParserTestDescriptor { // public String input = new StringBuilder() // .append("a") // .appendCodePoint(0x1D5C2) // .appendCodePoint(0x1D5CE) // .appendCodePoint(0x1D5BA) // .append("d") // .toString(); // public String output = new StringBuilder() // .append("a") // .appendCodePoint(0x1D5C2) // .appendCodePoint(0x1D5CE) // .appendCodePoint(0x1D5BA) // .append("d\n") // .toString(); // public String errors = null; // public String startRule = "a"; // public String grammarName = "T"; // /** // grammar T; // a : LETTERS* 'd' {<InputText():writeln()>} ; // // These are actually not escaped -- Java passes the // // raw unescaped Unicode values to the grammar compiler. // LETTERS : ('a'|'\uD83D\uDE00'..'\uD83E\uDD43'); // */ // @CommentHasStringValue // public String grammar; // } public static class UnicodeEscapedSMPRangeSet extends BaseParserTestDescriptor { public String input = new StringBuilder() .append("a") .appendCodePoint(0x1F609) .appendCodePoint(0x1F942) .appendCodePoint(0x1F700) .append("d") .toString(); public String output = new StringBuilder() .append("a") .appendCodePoint(0x1F609) .appendCodePoint(0x1F942) .appendCodePoint(0x1F700) .append("d\n") .toString(); public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS* 'd' {<InputText():writeln()>} ; // Note the double-backslash to avoid Java passing // unescaped values as part of the grammar. LETTERS : ('a'|'\\u{1F600}'..'\\u{1F943}'); */ @CommentHasStringValue public String grammar; } public static class UnicodeEscapedSMPRangeSetMismatch extends BaseParserTestDescriptor { // Test the code points just before and just after the range. public String input = new StringBuilder() .append("a") .appendCodePoint(0x1F5FF) .appendCodePoint(0x1F944) .append("d") .toString(); public String output = "ad\n"; public String errors = new StringBuilder() .append("line 1:1 token recognition error at: '") .appendCodePoint(0x1F5FF) .append("'\n") .append("line 1:2 token recognition error at: '") .appendCodePoint(0x1F944) .append("'\n") .toString(); public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS* 'd' {<InputText():writeln()>} ; // Note the double-backslash to avoid Java passing // unescaped values as part of the grammar. LETTERS : ('a'|'\\u{1F600}'..'\\u{1F943}'); */ @CommentHasStringValue public String grammar; } public static class UnicodeNegatedBMPSetIncludesSMPCodePoints extends BaseParserTestDescriptor { public String input = "a\uD83D\uDE33\uD83D\uDE21\uD83D\uDE1D\uD83E\uDD13c"; public String output = "a\uD83D\uDE33\uD83D\uDE21\uD83D\uDE1D\uD83E\uDD13c\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS {<InputText():writeln()>} ; LETTERS : 'a' ~('b')+ 'c'; */ @CommentHasStringValue public String grammar; } public static class UnicodeNegatedSMPSetIncludesBMPCodePoints extends BaseParserTestDescriptor { public String input = "abc"; public String output = "abc\n"; public String errors = null; public String startRule = "a"; public String grammarName = "T"; /** grammar T; a : LETTERS {<InputText():writeln()>} ; LETTERS : 'a' ~('\\u{1F600}'..'\\u{1F943}')+ 'c'; */ @CommentHasStringValue public String grammar; } }