670 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			670 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
| import unittest
 | |
| import textwrap
 | |
| import antlr3
 | |
| import testbase
 | |
| 
 | |
| class t042ast(testbase.ANTLRTest):
 | |
| ##     def lexerClass(self, base):
 | |
| ##         class TLexer(base):
 | |
| ##             def reportError(self, re):
 | |
| ##                 # no error recovery yet, just crash!
 | |
| ##                 raise re
 | |
| 
 | |
| ##         return TLexer
 | |
|     
 | |
| 
 | |
|     def parserClass(self, base):
 | |
|         class TParser(base):
 | |
|             def recover(self, input, re):
 | |
|                 # no error recovery yet, just crash!
 | |
|                 raise
 | |
| 
 | |
|         return TParser
 | |
|     
 | |
| 
 | |
|     def parse(self, text, method, rArgs=(), **kwargs):
 | |
|         self.compileGrammar() #options='-trace')
 | |
|         
 | |
|         cStream = antlr3.StringStream(text)
 | |
|         self.lexer = self.getLexer(cStream)
 | |
|         tStream = antlr3.CommonTokenStream(self.lexer)
 | |
|         self.parser = self.getParser(tStream)
 | |
|         
 | |
|         for attr, val in kwargs.items():
 | |
|             setattr(self.parser, attr, val)
 | |
|             
 | |
|         return getattr(self.parser, method)(*rArgs)
 | |
| 
 | |
|     
 | |
|     def testR1(self):
 | |
|         r = self.parse("1 + 2", 'r1')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(+ 1 2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR2a(self):
 | |
|         r = self.parse("assert 2+3;", 'r2')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(assert (+ 2 3))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR2b(self):
 | |
|         r = self.parse("assert 2+3 : 5;", 'r2')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(assert (+ 2 3) 5)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR3a(self):
 | |
|         r = self.parse("if 1 fooze", 'r3')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(if 1 fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR3b(self):
 | |
|         r = self.parse("if 1 fooze else fooze", 'r3')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(if 1 fooze fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR4a(self):
 | |
|         r = self.parse("while 2 fooze", 'r4')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(while 2 fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR5a(self):
 | |
|         r = self.parse("return;", 'r5')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'return'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR5b(self):
 | |
|         r = self.parse("return 2+3;", 'r5')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(return (+ 2 3))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR6a(self):
 | |
|         r = self.parse("3", 'r6')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '3'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR6b(self):
 | |
|         r = self.parse("3 a", 'r6')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '3 a'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR7(self):
 | |
|         r = self.parse("3", 'r7')
 | |
|         self.assertIsNone(r.tree)
 | |
| 
 | |
| 
 | |
|     def testR8(self):
 | |
|         r = self.parse("var foo:bool", 'r8')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(var bool foo)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR9(self):
 | |
|         r = self.parse("int foo;", 'r9')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(VARDEF int foo)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR10(self):
 | |
|         r = self.parse("10", 'r10')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '10.0'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR11a(self):
 | |
|         r = self.parse("1+2", 'r11')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR11b(self):
 | |
|         r = self.parse("", 'r11')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'EXPR'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR12a(self):
 | |
|         r = self.parse("foo", 'r12')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'foo'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR12b(self):
 | |
|         r = self.parse("foo, bar, gnurz", 'r12')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'foo bar gnurz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR13a(self):
 | |
|         r = self.parse("int foo;", 'r13')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(int foo)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR13b(self):
 | |
|         r = self.parse("bool foo, bar, gnurz;", 'r13')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(bool foo bar gnurz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR14a(self):
 | |
|         r = self.parse("1+2 int", 'r14')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR (+ 1 2) int)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR14b(self):
 | |
|         r = self.parse("1+2 int bool", 'r14')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR (+ 1 2) int bool)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR14c(self):
 | |
|         r = self.parse("int bool", 'r14')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR int bool)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR14d(self):
 | |
|         r = self.parse("fooze fooze int bool", 'r14')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR fooze fooze int bool)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR14e(self):
 | |
|         r = self.parse("7+9 fooze fooze int bool", 'r14')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(EXPR (+ 7 9) fooze fooze int bool)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR15(self):
 | |
|         r = self.parse("7", 'r15')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '7 7'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR16a(self):
 | |
|         r = self.parse("int foo", 'r16')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(int foo)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR16b(self):
 | |
|         r = self.parse("int foo, bar, gnurz", 'r16')
 | |
|             
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(int foo) (int bar) (int gnurz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR17a(self):
 | |
|         r = self.parse("for ( fooze ; 1 + 2 ; fooze ) fooze", 'r17')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(for fooze (+ 1 2) fooze fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR18a(self):
 | |
|         r = self.parse("for", 'r18')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'BLOCK'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR19a(self):
 | |
|         r = self.parse("for", 'r19')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'for'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR20a(self):
 | |
|         r = self.parse("for", 'r20')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'FOR'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR21a(self):
 | |
|         r = self.parse("for", 'r21')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'BLOCK'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR22a(self):
 | |
|         r = self.parse("for", 'r22')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'for'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR23a(self):
 | |
|         r = self.parse("for", 'r23')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'FOR'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR24a(self):
 | |
|         r = self.parse("fooze 1 + 2", 'r24')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(fooze (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR25a(self):
 | |
|         r = self.parse("fooze, fooze2 1 + 2", 'r25')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(fooze (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR26a(self):
 | |
|         r = self.parse("fooze, fooze2", 'r26')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(BLOCK fooze fooze2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR27a(self):
 | |
|         r = self.parse("fooze 1 + 2", 'r27')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(fooze (fooze (+ 1 2)))'
 | |
|             )
 | |
|             
 | |
| 
 | |
|     def testR28(self):
 | |
|         r = self.parse("foo28a", 'r28')
 | |
|         self.assertIsNone(r.tree)
 | |
| 
 | |
| 
 | |
|     def testR29(self):
 | |
|         self.assertRaises(RuntimeError, self.parse, "", 'r29')
 | |
| 
 | |
| 
 | |
| # FIXME: broken upstream?
 | |
| ##     def testR30(self):
 | |
| ##         try:
 | |
| ##             r = self.parse("fooze fooze", 'r30')
 | |
| ##             self.fail(r.tree.toStringTree())
 | |
| ##         except RuntimeError:
 | |
| ##             pass
 | |
| 
 | |
| 
 | |
|     def testR31a(self):
 | |
|         r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=0)
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(VARDEF gnurz public int (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR31b(self):
 | |
|         r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=1)
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(VARIABLE gnurz public int (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR31c(self):
 | |
|         r = self.parse("public int gnurz = 1 + 2;", 'r31', flag=2)
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(FIELD gnurz public int (+ 1 2))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR32a(self):
 | |
|         r = self.parse("gnurz 32", 'r32', [1], flag=2)
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'gnurz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR32b(self):
 | |
|         r = self.parse("gnurz 32", 'r32', [2], flag=2)
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '32'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR32c(self):
 | |
|         r = self.parse("gnurz 32", 'r32', [3], flag=2)
 | |
|         self.assertIsNone(r.tree)
 | |
| 
 | |
| 
 | |
|     def testR33a(self):
 | |
|         r = self.parse("public private fooze", 'r33')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'fooze'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR34a(self):
 | |
|         r = self.parse("public class gnurz { fooze fooze2 }", 'r34')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(class gnurz public fooze fooze2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR34b(self):
 | |
|         r = self.parse("public class gnurz extends bool implements int, bool { fooze fooze2 }", 'r34')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(class gnurz public (extends bool) (implements int bool) fooze fooze2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR35(self):
 | |
|         self.assertRaises(RuntimeError, self.parse, "{ extends }", 'r35')
 | |
| 
 | |
| 
 | |
|     def testR36a(self):
 | |
|         r = self.parse("if ( 1 + 2 ) fooze", 'r36')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(if (EXPR (+ 1 2)) fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR36b(self):
 | |
|         r = self.parse("if ( 1 + 2 ) fooze else fooze2", 'r36')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(if (EXPR (+ 1 2)) fooze fooze2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR37(self):
 | |
|         r = self.parse("1 + 2 + 3", 'r37')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(+ (+ 1 2) 3)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR38(self):
 | |
|         r = self.parse("1 + 2 + 3", 'r38')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(+ (+ 1 2) 3)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR39a(self):
 | |
|         r = self.parse("gnurz[1]", 'r39')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(INDEX gnurz 1)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR39b(self):
 | |
|         r = self.parse("gnurz(2)", 'r39')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(CALL gnurz 2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR39c(self):
 | |
|         r = self.parse("gnurz.gnarz", 'r39')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(FIELDACCESS gnurz gnarz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR39d(self):
 | |
|         r = self.parse("gnurz.gnarz.gnorz", 'r39')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(FIELDACCESS (FIELDACCESS gnurz gnarz) gnorz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR40(self):
 | |
|         r = self.parse("1 + 2 + 3;", 'r40')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(+ 1 2 3)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR41(self):
 | |
|         r = self.parse("1 + 2 + 3;", 'r41')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(3 (2 1))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR42(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r42')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'gnurz gnarz gnorz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR43(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r43')
 | |
|         self.assertIsNone(r.tree)
 | |
|         self.assertEqual(
 | |
|             r.res,
 | |
|             ['gnurz', 'gnarz', 'gnorz']
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR44(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r44')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(gnorz (gnarz gnurz))'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR45(self):
 | |
|         r = self.parse("gnurz", 'r45')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'gnurz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR46(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r46')
 | |
|         self.assertIsNone(r.tree)
 | |
|         self.assertEqual(
 | |
|             r.res,
 | |
|             ['gnurz', 'gnarz', 'gnorz']
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR47(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r47')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'gnurz gnarz gnorz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR48(self):
 | |
|         r = self.parse("gnurz, gnarz, gnorz", 'r48')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'gnurz gnarz gnorz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR49(self):
 | |
|         r = self.parse("gnurz gnorz", 'r49')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(gnurz gnorz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR50(self):
 | |
|         r = self.parse("gnurz", 'r50')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(1.0 gnurz)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR51(self):
 | |
|         r = self.parse("gnurza gnurzb gnurzc", 'r51')
 | |
|         self.assertEqual(
 | |
|             r.res.toStringTree(),
 | |
|             'gnurzb'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR52(self):
 | |
|         r = self.parse("gnurz", 'r52')
 | |
|         self.assertEqual(
 | |
|             r.res.toStringTree(),
 | |
|             'gnurz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR53(self):
 | |
|         r = self.parse("gnurz", 'r53')
 | |
|         self.assertEqual(
 | |
|             r.res.toStringTree(),
 | |
|             'gnurz'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR54(self):
 | |
|         r = self.parse("gnurza 1 + 2 gnurzb", 'r54')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(+ 1 2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR55a(self):
 | |
|         r = self.parse("public private 1 + 2", 'r55')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'public private (+ 1 2)'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR55b(self):
 | |
|         r = self.parse("public fooze", 'r55')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'public fooze'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR56(self):
 | |
|         r = self.parse("a b c d", 'r56')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'foo'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR57(self):
 | |
|         r = self.parse("a b c d", 'r57')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             'foo'
 | |
|             )
 | |
| 
 | |
| 
 | |
|     def testR59(self):
 | |
|         r = self.parse("a b c fooze", 'r59')
 | |
|         self.assertEqual(
 | |
|             r.tree.toStringTree(),
 | |
|             '(a fooze) (b fooze) (c fooze)'
 | |
|             )
 | |
| 
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     unittest.main()
 | |
| 
 |