1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(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._output = "" 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(self, t): 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output += t 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(self, input, re): 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # no error recovery yet, just crash! 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TParser 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def lexerClass(self, base): 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class TLexer(base): 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args, **kwargs): 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.__init__(self, *args, **kwargs) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output = "" 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(self, t): 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output += t 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(self, input, re): 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # no error recovery yet, just crash! 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TLexer 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execParser(self, grammar, grammarEntry, input): 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerCls, parserCls = self.compileInlineGrammar(grammar) 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = lexerCls(cStream) 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = parserCls(tStream) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(parser, grammarEntry)() 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if r is not None: 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return r.tree.toStringTree() 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return "" 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerCls, parserCls = self.compileInlineGrammar(grammar) 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walkerCls = self.compileInlineGrammar(treeGrammar) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = lexerCls(cStream) 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = parserCls(tStream) 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(parser, grammarEntry)() 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.setTokenStream(tStream) 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = walkerCls(nodes) 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(walker, treeEntry)() 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if r is not None: 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return r.tree.toStringTree() 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return "" 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # PARSERS -- AUTO AST 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testToken(self): 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T1; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V> ; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenCommonTree(self): 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<CommonTree> ; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a") 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a", found) 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenWithQualifiedType(self): 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<TParser.V> ; // TParser.V is qualified name 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNamedType(self): 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r""" 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar $T; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<node=V> ; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver """) 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser(grammar, 'a', input="a") 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("a<V>", found) 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenWithLabel(self): 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T2; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID<V> ; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenWithListLabel(self): 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T3; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=ID<V> ; 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenRoot(self): 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T4; 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V>^ ; 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTokenRootWithListLabel(self): 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T5; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=ID<V>^ ; 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testString(self): 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T6; 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin'<V> ; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="begin" 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("begin<V>", found) 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testStringRoot(self): 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T7; 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin'<V>^ ; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="begin" 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("begin<V>", found) 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # PARSERS -- REWRITE AST 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteToken(self): 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T8; 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID<V> ; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("a<V>", found) 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteTokenWithArgs(self): 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T9; 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args): 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if len(args) == 4: 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ttype = args[0] 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver x = args[1] 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver y = args[2] 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver z = args[3] 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = CommonToken(type=ttype, text="") 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elif len(args) == 3: 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ttype = args[0] 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = args[1] 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver x = args[2] 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver y, z = 0, 0 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise TypeError("Invalid args \%r" \% (args,)) 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, token) 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.x = x 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.y = y 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.z = z 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver txt = "" 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if self.token is not None: 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver txt += self.token.text 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver txt +="<V>;\%d\%d\%d" \% (self.x, self.y, self.z) 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return txt 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID<V>[42,19,30] ID<V>[$ID,99]; 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a" 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("<V>;421930 a<V>;9900", found) 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteTokenRoot(self): 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T10; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(ID<V> INT) ; 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+ ; 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a 2" 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(a<V> 2)", found) 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteString(self): 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T11; 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin' -> 'begin'<V> ; 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="begin" 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("begin<V>", found) 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteStringRoot(self): 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T12; 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin' INT -> ^('begin'<V> INT) ; 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+ ; 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="begin 2" 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(begin<V> 2)", found) 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRewriteRuleResults(self): 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {LIST;} 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W(CommonTree): 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, tokenType, txt): 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(W, self).__init__( 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonToken(type=tokenType, text=txt)) 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<W>" 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : id (',' id)* -> ^(LIST<W>["LIST"] id+); 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver id : ID -> ID<V>; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execParser( 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="a,b,c") 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(LIST<W> a<V> b<V> c<V>)", found) 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testCopySemanticsWithHetero(self): 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def dupNode(self): 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return V(self) 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : type ID (',' ID)* ';' -> ^(type ID)+; 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int'<V> ; 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( 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="int a, b, c;") 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(int<V> a) (int<V> b) (int<V> c)", found) 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # TREE PARSERS -- REWRITE AST 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteFlatList(self): 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T13; 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP13; 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T13; 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W(CommonTree): 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<W>" 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> INT<V> ID<W> 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc 34" 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("34<V> abc<W>", found) 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteTree(self): 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T14; 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP14; 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T14; 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<V>" 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W(CommonTree): 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self.token.text + "<W>" 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(INT<V> ID<W>) 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc 34" 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(34<V> abc<W>)", found) 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteImaginary(self): 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T15; 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP15; 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T15; 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, tokenType): 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, CommonToken(tokenType)) 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenNames[self.token.type] + "<V>" 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V> ID 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc" 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("ROOT<V> abc", found) 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteImaginaryWithArgs(self): 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T16; 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP16; 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T16; 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, tokenType, x): 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, CommonToken(tokenType)) 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.x = x 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenNames[self.token.type] + "<V>;" + str(self.x) 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V>[42] ID 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc" 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("ROOT<V>;42 abc", found) 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteImaginaryRoot(self): 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T17; 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP17; 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T17; 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, tokenType): 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, CommonToken(tokenType)) 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenNames[self.token.type] + "<V>" 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ^(ROOT<V> ID) 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc" 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("(ROOT<V> abc)", found) 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserRewriteImaginaryFromReal(self): 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T18; 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP18; 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T18; 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, tokenType, tree=None): 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if tree is None: 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, CommonToken(tokenType)) 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree.__init__(self, tree) 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.token.type = tokenType 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenNames[self.token.type]+"<V>@"+str(self.token.line) 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V>[$ID] 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc" 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("ROOT<V>@1", found) 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testTreeParserAutoHeteroAST(self): 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ';' ; 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP; 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=T; 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @header { 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V(CommonTree): 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def toString(self): 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return CommonTree.toString(self) + "<V>" 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver __str__ = toString 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V> ';'<V>; 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input="abc;" 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc<V> ;<V>", found) 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__': 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unittest.main() 940