1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest): 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def walkerClass(self, base): 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class TWalker(base): 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args, **kwargs): 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.__init__(self, *args, **kwargs) 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output = "" 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(self, t): 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self._output += t 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(self, input, re): 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # no error recovery yet, just crash! 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TWalker 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerCls, parserCls = self.compileInlineGrammar(grammar) 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walkerCls = self.compileInlineGrammar(treeGrammar) 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = lexerCls(cStream) 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = parserCls(tStream) 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = getattr(parser, grammarEntry)() 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.setTokenStream(tStream) 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = walkerCls(nodes) 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getattr(walker, treeEntry)() 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return walker._output 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testFlatList(self): 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture("\%s, \%s" \% ($ID, $INT))} 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc 34" 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc, 34", found) 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testSimpleTree(self): 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(ID INT); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT) 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture(str($ID)+", "+str($INT))} 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc 34" 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc, 34", found) 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testFlatVsTreeDecision(self): 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT -> ^(ID INT); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : ID INT; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT {self.capture(str($ID)+" "+str($INT)+'\n')} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(ID INT) {self.capture("^("+str($ID)+" "+str($INT)+')');} 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a 1 b 2" 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("^(a 1)b 2\n", found) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testFlatVsTreeDecision2(self): 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r"""grammar T; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT+ -> ^(ID INT+); 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : ID INT+; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver """) 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT+ {self.capture(str($ID)+" "+str($INT)+"\n")} 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(x=ID (y=INT)+) {self.capture("^("+str($x)+' '+str($y)+')')} 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a 1 2 3 b 4 5" 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("^(a 3)b 5\n", found) 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testCyclicDFALookahead(self): 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT+ PERIOD; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT+ PERIOD {self.capture("alt 1")} 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ID INT+ SEMI {self.capture("alt 2")} 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a 1 2 3." 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("alt 1", found) 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## def testTemplateOutput(self): 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## String grammar = 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "grammar T;\n" + 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "options {output=AST;}\n" + 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "a : ID INT;\n" + 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "ID : 'a'..'z'+ ;\n" + 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "INT : '0'..'9'+;\n" + 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## String treeGrammar = 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "tree grammar TP;\n" + 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "options {output=template; ASTLabelType=CommonTree;}\n" + 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "s : a {System.out.println($a.st);};\n" + 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## "a : ID INT -> {new StringTemplate($INT.text)}\n" + 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## " ;\n"; 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## assertEquals("34\n", found); 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNullableChildList(self): 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT? -> ^(ID INT?); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT?) 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture(str($ID))} 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc" 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc", found) 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNullableChildList2(self): 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT? SEMI -> ^(ID INT?) SEMI ; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT?) SEMI 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture(str($ID))} 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc;" 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc", found) 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testNullableChildList3(self): 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID INT? (y=ID)? SEMI -> ^($x INT? $y?) SEMI ; 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT? b) SEMI 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture(str($ID)+", "+str($b.text))} 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID? ; 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc def;" 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual("abc, def", found) 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testActionsAfterRoot(self): 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''grammar T; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID INT? SEMI -> ^($x INT?) ; 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r'''tree grammar TP; 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Python; 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a @init {x=0} : ^(ID {x=1} {x=2} INT?) 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture(str($ID)+", "+str(x))} 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "abc;" 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnless("abc, 2\n", found) 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardLookahead(self): 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; output=AST;} 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;} 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' . INT) { self.capture("alt 1") } 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a + 2") 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("alt 1", found) 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardLookahead2(self): 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; output=AST;} 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP; 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;} 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' . INT) { self.capture("alt 1") } 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' . .) { self.capture("alt 2") } 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # AMBIG upon '+' DOWN INT UP etc.. but so what. 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a + 2") 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("alt 1", found) 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardLookahead3(self): 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; output=AST;} 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP; 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;} 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' ID INT) { self.capture("alt 1") } 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' . .) { self.capture("alt 2") } 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # AMBIG upon '+' DOWN INT UP etc.. but so what. 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a + 2") 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("alt 1", found) 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWildcardPlusLookahead(self): 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar = textwrap.dedent( 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar T; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; output=AST;} 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar = textwrap.dedent( 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r''' 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TP; 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;} 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' INT INT ) { self.capture("alt 1") } 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' .+) { self.capture("alt 2") } 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # AMBIG upon '+' DOWN INT UP etc.. but so what. 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = self.execTreeParser( 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar, 'a', 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, 'a', 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a + 2") 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.assertEquals("alt 2", found) 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__': 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unittest.main() 500