1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport re 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Left-recursion resolution is not yet enabled in the tool. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# class TestLeftRecursion(testbase.ANTLRTest): 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def parserClass(self, base): 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# class TParser(base): 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def __init__(self, *args, **kwargs): 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# base.__init__(self, *args, **kwargs) 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self._output = "" 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def capture(self, t): 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self._output += str(t) 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def recover(self, input, re): 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# # no error recovery yet, just crash! 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# raise 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# return TParser 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def execParser(self, grammar, grammarEntry, input): 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# lexerCls, parserCls = self.compileInlineGrammar(grammar) 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# cStream = antlr3.StringStream(input) 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# lexer = lexerCls(cStream) 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tStream = antlr3.CommonTokenStream(lexer) 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# parser = parserCls(tStream) 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# getattr(parser, grammarEntry)() 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# return parser._output 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def runTests(self, grammar, tests, grammarEntry): 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# lexerCls, parserCls = self.compileInlineGrammar(grammar) 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# build_ast = re.search(r'output\s*=\s*AST', grammar) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# for input, expecting in tests: 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# cStream = antlr3.StringStream(input) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# lexer = lexerCls(cStream) 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tStream = antlr3.CommonTokenStream(lexer) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# parser = parserCls(tStream) 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r = getattr(parser, grammarEntry)() 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# found = parser._output 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# if build_ast: 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# found += r.tree.toStringTree() 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.assertEquals( 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# expecting, found, 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# "%r != %r (for input %r)" % (expecting, found, input)) 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testSimple(self): 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# s : a { self.capture($a.text) } ; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# a : a ID 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# found = self.execParser(grammar, 's', 'a b c') 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# expecting = "abc" 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.assertEquals(expecting, found) 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testSemPred(self): 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# s : a { self.capture($a.text) } ; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# a : a {True}? ID 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# found = self.execParser(grammar, "s", "a b c") 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# expecting = "abc" 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.assertEquals(expecting, found) 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testTernaryExpr(self): 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : e '*'^ e 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '+'^ e 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '?'<assoc=right>^ e ':'! e 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '='<assoc=right>^ e 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+b", "(+ a b)"), 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a*b", "(* a b)"), 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a?b:c", "(? a b c)"), 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a=b=c", "(= a (= b c))"), 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a?b+c:d", "(? a (+ b c) d)"), 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a?b=c:d", "(? a (= b c) d)"), 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a? b?c:d : e", "(? a (? b c d) e)"), 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a?b: c?d:e", "(? a b (? c d e))"), 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "e") 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testDeclarationsUsingASTOperators(self): 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# declarator 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : declarator '['^ e ']'! 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | declarator '['^ ']'! 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | declarator '('^ ')'! 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '*'^ declarator // binds less tight than suffixes 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '('! declarator ')'! 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : INT ; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("*a", "(* a)"), 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("**a", "(* (* a))"), 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[3]", "([ a 3)"), 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("b[]", "([ b)"), 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(a)", "a"), 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[]()", "(( ([ a))"), 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[][]", "([ ([ a))"), 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("*a[]", "(* ([ a))"), 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(*a)[]", "([ (* a))"), 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "declarator") 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testDeclarationsUsingRewriteOperators(self): 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# declarator 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : declarator '[' e ']' -> ^('[' declarator e) 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | declarator '[' ']' -> ^('[' declarator) 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | declarator '(' ')' -> ^('(' declarator) 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '*' declarator -> ^('*' declarator) // binds less tight than suffixes 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '(' declarator ')' -> declarator 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID -> ID 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : INT ; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("*a", "(* a)"), 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("**a", "(* (* a))"), 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[3]", "([ a 3)"), 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("b[]", "([ b)"), 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(a)", "a"), 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[]()", "(( ([ a))"), 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a[][]", "([ ([ a))"), 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("*a[]", "(* ([ a))"), 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(*a)[]", "([ (* a))"), 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "declarator") 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testExpressionsUsingASTOperators(self): 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : e '.'^ ID 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.'^ 'this' 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '-'^ e 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '*'^ e 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('+'^|'-'^) e 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1", "1"), 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+1", "(+ a 1)"), 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a*1", "(* a 1)"), 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b", "(. a b)"), 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.this", "(. a this)"), 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a-b+c", "(+ (- a b) c)"), 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+b*c", "(+ a (* b c))"), 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b+1", "(+ (. a b) 1)"), 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a", "(- a)"), 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a+b", "(+ (- a) b)"), 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a.b", "(- (. a b))"), 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "e") 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# @testbase.broken( 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# "Grammar compilation returns errors", testbase.GrammarCompileError) 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testExpressionsUsingRewriteOperators(self): 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : e '.' ID -> ^('.' e ID) 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.' 'this' -> ^('.' e 'this') 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '-' e -> ^('-' e) 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '*' b=e -> ^('*' e $b) 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e (op='+'|op='-') b=e -> ^($op e $b) 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT -> INT 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID -> ID 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1", "1"), 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+1", "(+ a 1)"), 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a*1", "(* a 1)"), 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b", "(. a b)"), 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.this", "(. a this)"), 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+b*c", "(+ a (* b c))"), 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b+1", "(+ (. a b) 1)"), 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a", "(- a)"), 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a+b", "(+ (- a) b)"), 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a.b", "(- (. a b))"), 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "e") 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testExpressionAssociativity(self): 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : e '.'^ ID 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '-'^ e 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '^'<assoc=right>^ e 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '*'^ e 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('+'^|'-'^) e 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('='<assoc=right>^ |'+='<assoc=right>^) e 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : 'a'..'z'+ ; 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1", "1"), 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+1", "(+ a 1)"), 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a*1", "(* a 1)"), 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b", "(. a b)"), 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a-b+c", "(+ (- a b) c)"), 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+b*c", "(+ a (* b c))"), 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b+1", "(+ (. a b) 1)"), 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a", "(- a)"), 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a+b", "(+ (- a) b)"), 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a.b", "(- (. a b))"), 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a^b^c", "(^ a (^ b c))"), 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a=b=c", "(= a (= b c))"), 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"), 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "e") 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testJavaExpressions(self): 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# expressionList 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : e (','! e)* 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e : '('! e ')'! 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | 'this' 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | 'super' 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | type '.'^ 'class' 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.'^ ID 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.'^ 'this' 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.'^ 'super' '('^ expressionList? ')'! 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '.'^ 'new'^ ID '('! expressionList? ')'! 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | 'new'^ type ( '(' expressionList? ')'! | (options {k=1;}:'[' e ']'!)+) // ugly; simplified 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '['^ e ']'! 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | '('^ type ')'! e 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('++'^ | '--'^) 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '('^ expressionList? ')'! 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ('+'^|'-'^|'++'^|'--'^) e 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ('~'^|'!'^) e 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('*'^|'/'^|'%'^) e 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('+'^|'-'^) e 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('<'^ '<' | '>'^ '>' '>' | '>'^ '>') e 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('<='^ | '>='^ | '>'^ | '<'^) e 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e 'instanceof'^ e 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('=='^ | '!='^) e 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '&'^ e 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '^'<assoc=right>^ e 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '|'^ e 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '&&'^ e 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '||'^ e 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '?' e ':' e 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e ('='<assoc=right>^ 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'+='<assoc=right>^ 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'-='<assoc=right>^ 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'*='<assoc=right>^ 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'/='<assoc=right>^ 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'&='<assoc=right>^ 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'|='<assoc=right>^ 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'^='<assoc=right>^ 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'>>='<assoc=right>^ 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'>>>='<assoc=right>^ 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'<<='<assoc=right>^ 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# |'%='<assoc=right>^) e 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# type: ID 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | ID '['^ ']'! 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | 'int' 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | 'int' '['^ ']'! 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ID : ('a'..'z'|'A'..'Z'|'_'|'$')+; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a", "a"), 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1", "1"), 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+1", "(+ a 1)"), 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a*1", "(* a 1)"), 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b", "(. a b)"), 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a-b+c", "(+ (- a b) c)"), 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a+b*c", "(+ a (* b c))"), 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.b+1", "(+ (. a b) 1)"), 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a", "(- a)"), 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a+b", "(+ (- a) b)"), 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("-a.b", "(- (. a b))"), 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a^b^c", "(^ a (^ b c))"), 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a=b=c", "(= a (= b c))"), 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"), 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a|b&c", "(| a (& b c))"), 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(a|b)&c", "(& (| a b) c)"), 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a > b", "(> a b)"), 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a >> b", "(> a b)"), # text is from one token 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a < b", "(< a b)"), 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(T)x", "(( T x)"), 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("new A().b", "(. (new A () b)"), 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("(T)t.f()", "(( (( T (. t f)))"), 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.f(x)==T.c", "(== (( (. a f) x) (. T c))"), 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("a.f().g(x,1)", "(( (. (( (. a f)) g) x 1)"), 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("new T[((n-1) * x) + 1]", "(new T [ (+ (* (- n 1) x) 1))"), 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "e") 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testReturnValueAndActions(self): 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# s : e { self.capture($e.v) } ; 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e returns [v, ignored] 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : e '*' b=e {$v *= $b.v;} 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '+' b=e {$v += $b.v;} 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT {$v = int($INT.text);} 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("4", "4"), 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1+2", "3") 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "s") 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# def testReturnValueAndActionsAndASTs(self): 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar = textwrap.dedent( 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# r""" 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# grammar T; 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# options { 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# language=Python; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# output=AST; 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# } 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# s : e { self.capture("v=\%s, " \% $e.v) } ; 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# e returns [v, ignored] 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# : e '*'^ b=e {$v *= $b.v;} 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | e '+'^ b=e {$v += $b.v;} 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# | INT {$v = int($INT.text);} 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INT : '0'..'9'+ ; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# WS : (' '|'\n') {self.skip()} ; 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# """) 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# tests = [ 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("4", "v=4, 4"), 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ("1+2", "v=3, (+ 1 2)"), 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ] 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# self.runTests(grammar, tests, "s") 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__': 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unittest.main() 469