1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestAutoAST(testbase.ANTLRTest): 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parserClass(self, base): 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class TParser(base): 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args, **kwargs): 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.__init__(self, *args, **kwargs) 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._errors = [] 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output = "" 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(self, t): 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output += t 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emitErrorMessage(self, msg): 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._errors.append(msg) 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TParser 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def lexerClass(self, base): 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class TLexer(base): 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args, **kwargs): 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.__init__(self, *args, **kwargs) 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output = "" 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(self, t): 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output += t 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(self, input, re): 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # no error recovery yet, just crash! 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TLexer 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execParser(self, grammar, grammarEntry, input, expectErrors=False): 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerCls, parserCls = self.compileInlineGrammar(grammar) 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = lexerCls(cStream) 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = parserCls(tStream) 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(parser, grammarEntry)() 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if not expectErrors: 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(len(parser._errors), 0, parser._errors) 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = "" 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if r is not None: 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if hasattr(r, 'result'): 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result += r.result 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if r.tree is not None: 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result += r.tree.toStringTree() 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if not expectErrors: 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return result 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return result, parser._errors 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerCls, parserCls = self.compileInlineGrammar(grammar) 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walkerCls = self.compileInlineGrammar(treeGrammar) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = lexerCls(cStream) 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = parserCls(tStream) 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(parser, grammarEntry)() 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.setTokenStream(tStream) 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = walkerCls(nodes) 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(walker, treeEntry)() 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if r is not None: 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return r.tree.toStringTree() 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return "" 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenList(self): 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT ; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;}; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "abc 34") 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc 34", found); 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenListInSingleAltBlock(self): 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : (ID INT) ; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar,"a", "abc 34") 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc 34", found) 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSimpleRootAtOuterLevel(self): 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID^ INT ; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "abc 34") 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(abc 34)", found) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSimpleRootAtOuterLevelReverse(self): 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : INT ID^ ; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34 abc") 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(abc 34)", found) 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testBang(self): 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT! ID! INT ; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "abc 34 dag 4532") 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc 4532", found) 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testOptionalThenRoot(self): 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ( ID INT )? ID^ ; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a 1 b") 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(b a 1)", found) 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testLabeledStringRoot(self): 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void'^ ID ';' ; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(void foo ;)", found) 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcard(self): 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void'^ . ';' ; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(void foo ;)", found) 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardRoot(self): 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void' .^ ';' ; 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(foo void ;)", found) 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardRootWithLabel(self): 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void' x=.^ ';' ; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(foo void ;)", found) 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardRootWithListLabel(self): 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void' x=.^ ';' ; 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(foo void ;)", found) 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardBangWithListLabel(self): 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : v='void' x=.! ';' ; 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void foo;") 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("void ;", found) 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRootRoot(self): 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID^ INT^ ID ; 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a 34 c") 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(34 a c)", found) 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRootRoot2(self): 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT^ ID^ ; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a 34 c") 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(c (34 a))", found) 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRootThenRootInLoop(self): 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID^ (INT '*'^ ID)+ ; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a 34 * b 9 * c") 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(* (* (a 34) b 9) c)", found) 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNestedSubrule(self): 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'void' (({pass}ID|INT) ID | 'null' ) ';' ; 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "void a b;") 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("void a b ;", found) 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testInvokeRule(self): 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : type ID ; 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : {pass}'int' | 'float' ; 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "int a") 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("int a", found) 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testInvokeRuleAsRoot(self): 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : type^ ID ; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : {pass}'int' | 'float' ; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "int a") 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(int a)", found) 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testInvokeRuleAsRootWithLabel(self): 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=type^ ID ; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : {pass}'int' | 'float' ; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "int a") 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(int a)", found) 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testInvokeRuleAsRootWithListLabel(self): 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=type^ ID ; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : {pass}'int' | 'float' ; 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "int a") 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(int a)", found) 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleRootInLoop(self): 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ('+'^ ID)* ; 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a+b+c+d") 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(+ (+ (+ a b) c) d)", found) 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleInvocationRuleRootInLoop(self): 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID (op^ ID)* ; 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver op : {pass}'+' | '-' ; 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a+b+c-d") 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(- (+ (+ a b) c) d)", found) 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTailRecursion(self): 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : a ; 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : atom ('exp'^ a)? ; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom : INT ; 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "s", "3 exp 4 exp 5") 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(exp 3 (exp 4 5))", found) 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSet(self): 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID|INT ; 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "abc") 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc", found) 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSetRoot(self): 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ('+' | '-')^ ID ; 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "+abc") 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(+ abc)", found) 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @testbase.broken( 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "FAILS until antlr.g rebuilt in v3", testbase.GrammarCompileError) 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSetRootWithLabel(self): 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=('+' | '-')^ ID ; 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "+abc") 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(+ abc)", found) 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSetAsRuleRootInLoop(self): 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID (('+'|'-')^ ID)* ; 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a+b-c") 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(- (+ a b) c)", found) 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSet(self): 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ~ID '+' INT ; 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34+2") 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("34 + 2", found) 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetWithLabel(self): 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=~ID '+' INT ; 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34+2") 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("34 + 2", found) 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetWithListLabel(self): 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=~ID '+' INT ; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34+2") 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("34 + 2", found) 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetRoot(self): 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ~'+'^ INT ; 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34 55") 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(34 55)", found) 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetRootWithLabel(self): 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ~'+'^ INT ; 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34 55") 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(34 55)", found) 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetRootWithListLabel(self): 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ~'+'^ INT ; 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "34 55") 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(34 55)", found) 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNotSetRuleRootInLoop(self): 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : INT (~INT^ INT)* ; 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver blort : '+' ; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "3+4+5") 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(+ (+ 3 4) 5)", found) 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @testbase.broken("FIXME: What happened to the semicolon?", AssertionError) 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenLabelReuse(self): 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # check for compilation problem due to multiple defines 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : id=ID id=ID {$result = "2nd id="+$id.text+";";} ; 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("2nd id=b;a b", found) 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenLabelReuse2(self): 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # check for compilation problem due to multiple defines 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result]: id=ID id=ID^ {$result = "2nd id="+$id.text+',';} ; 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("2nd id=b,(b a)", found) 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenListLabelReuse(self): 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # check for compilation problem due to multiple defines 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # make sure ids has both ID tokens 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : ids+=ID ids+=ID {$result = "id list=["+",".join([t.text for t in $ids])+'],';} ; 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = "id list=[a,b],a b" 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(expecting, found) 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenListLabelReuse2(self): 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # check for compilation problem due to multiple defines 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # make sure ids has both ID tokens 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : ids+=ID^ ids+=ID {$result = "id list=["+",".join([t.text for t in $ids])+'],';} ; 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = "id list=[a,b],(a b)" 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(expecting, found) 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenListLabelRuleRoot(self): 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : id+=ID^ ; 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a") 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("a", found) 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenListLabelBang(self): 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : id+=ID! ; 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a") 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("", found) 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleListLabel(self): 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result]: x+=b x+=b { 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t=$x[1] 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $result = "2nd x="+t.toStringTree()+','; 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID; 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("2nd x=b,a b", found) 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleListLabelRuleRoot(self): 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : ( x+=b^ )+ { 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $result = "x="+$x[1].toStringTree()+','; 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } ; 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID; 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("x=(b a),(b a)", found) 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleListLabelBang(self): 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : x+=b! x+=b { 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $result = "1st x="+$x[0].toStringTree()+','; 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } ; 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID; 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b") 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("1st x=a,b", found) 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testComplicatedMelange(self): 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # check for compilation problem 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : A b=B b=B c+=C c+=C D {s = $D.text} ; 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' ; 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C : 'c' ; 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver D : 'd' ; 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "a b b c c d") 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("a b b c c d", found) 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testReturnValueWithAST(self): 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [result] : ID b { $result = str($b.i) + '\n';} ; 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b returns [i] : INT {$i=int($INT.text);} ; 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "a", "abc 34") 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("34\nabc 34", found) 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSetLoop(self): 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Python;output=AST; } 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r : (INT|ID)+ ; 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z' + ; 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9' +; 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: (' ' | '\n' | '\\t')+ {$channel = HIDDEN;}; 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, "r", "abc 34 d") 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc 34 d", found) 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testExtraTokenInSimpleDecl(self): 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type^ ID '='! INT ';'! ; 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "decl", "int 34 x=1;", 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expectErrors=True) 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:4 extraneous input u'34' expecting ID"], 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors) 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(int x 1)", found) # tree gets correct x and 1 tokens 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingIDInSimpleDecl(self): 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {EXPR;} 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type^ ID '='! INT ';'! ; 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "decl", "int =1;", 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expectErrors=True) 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:4 missing ID at u'='"], errors) 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(int <missing ID> 1)", found) # tree gets invented ID token 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingSetInSimpleDecl(self): 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {EXPR;} 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver decl : type^ ID '='! INT ';'! ; 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int' | 'float' ; 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "decl", "x=1;", 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expectErrors=True) 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:0 mismatched input u'x' expecting set None"], errors) 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("(<error: x> x 1)", found) # tree gets invented ID token 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingTokenGivesErrorNode(self): 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT ; // follow is EOF 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "abc", expectErrors=True) 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:3 missing INT at '<EOF>'"], errors) 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc <missing INT>", found) 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingTokenGivesErrorNodeInInvokedRule(self): 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b ; 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT ; // follow should see EOF 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "abc", expectErrors=True) 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:3 mismatched input '<EOF>' expecting INT"], errors) 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("<mismatched token: <EOF>, resync=abc>", found) 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testExtraTokenGivesErrorNode(self): 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT ; 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "abc ick 34", 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expectErrors=True) 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:4 extraneous input u'ick' expecting INT"], 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors) 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("abc 34", found) 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingFirstTokenGivesErrorNode(self): 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT ; 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "34", expectErrors=True) 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:0 missing ID at u'34'"], errors) 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("<missing ID> 34", found) 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testMissingFirstTokenGivesErrorNode2(self): 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT ; 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "34", expectErrors=True) 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # finds an error at the first token, 34, and re-syncs. 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # re-synchronizing does not consume a token because 34 follows 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # ref to rule b (start of c). It then matches 34 in c. 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:0 missing ID at u'34'"], errors) 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("<missing ID> 34", found) 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNoViableAltGivesErrorNode(self): 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar foo; 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python;output=AST;} 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b | c ; 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID ; 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : INT ; 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S : '*' ; 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found, errors = self.execParser(grammar, "a", "*", expectErrors=True) 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals(["line 1:0 no viable alternative at input u'*'"], 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver errors) 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("<unexpected: [@0,0:0=u'*',<6>,1:0], resync=*>", 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found) 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__': 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unittest.main() 1006