1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver"""ANTLR3 runtime package""" 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# begin[licence] 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# [The "BSD licence"] 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Copyright (c) 2005-2008 Terence Parr 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# All rights reserved. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Redistribution and use in source and binary forms, with or without 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# modification, are permitted provided that the following conditions 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# are met: 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 1. Redistributions of source code must retain the above copyright 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# notice, this list of conditions and the following disclaimer. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 2. Redistributions in binary form must reproduce the above copyright 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# notice, this list of conditions and the following disclaimer in the 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# documentation and/or other materials provided with the distribution. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 3. The name of the author may not be used to endorse or promote products 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# derived from this software without specific prior written permission. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# end[licence] 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport optparse 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass _Main(object): 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self): 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stdin = sys.stdin 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stdout = sys.stdout 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stderr = sys.stderr 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parseOptions(self, argv): 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser = optparse.OptionParser() 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--encoding", 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="encoding" 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--input", 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="input" 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--interactive", "-i", 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store_true", 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="interactive" 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--no-output", 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store_true", 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="no_output" 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--profile", 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store_true", 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="profile" 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--hotshot", 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store_true", 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="hotshot" 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--port", 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="int", 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="port", 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=None 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--debug-socket", 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action='store_true', 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="debug_socket", 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=None 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.setupOptions(optParser) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return optParser.parse_args(argv[1:]) 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setupOptions(self, optParser): 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pass 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def execute(self, argv): 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options, args = self.parseOptions(argv) 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.setUp(options) 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if options.interactive: 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while True: 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try: 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input = raw_input(">>> ") 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver except (EOFError, KeyboardInterrupt): 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stdout.write("\nBye.\n") 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inStream = antlr3.ANTLRStringStream(input) 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.parseStream(options, inStream) 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if options.input is not None: 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inStream = antlr3.ANTLRStringStream(options.input) 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elif len(args) == 1 and args[0] != '-': 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inStream = antlr3.ANTLRFileStream( 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[0], encoding=options.encoding 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inStream = antlr3.ANTLRInputStream( 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stdin, encoding=options.encoding 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if options.profile: 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try: 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import cProfile as profile 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver except ImportError: 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import profile 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver profile.runctx( 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'self.parseStream(options, inStream)', 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver globals(), 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver locals(), 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'profile.dat' 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import pstats 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stats = pstats.Stats('profile.dat') 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stats.strip_dirs() 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stats.sort_stats('time') 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stats.print_stats(100) 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elif options.hotshot: 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import hotshot 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver profiler = hotshot.Profile('hotshot.dat') 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver profiler.runctx( 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'self.parseStream(options, inStream)', 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver globals(), 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver locals() 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.parseStream(options, inStream) 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setUp(self, options): 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pass 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parseStream(self, options, inStream): 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise NotImplementedError 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def write(self, options, text): 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if not options.no_output: 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.stdout.write(text) 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def writeln(self, options, text): 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.write(options, text + '\n') 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass LexerMain(_Main): 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, lexerClass): 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Main.__init__(self) 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClass = lexerClass 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parseStream(self, options, inStream): 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = self.lexerClass(inStream) 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for token in lexer: 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.writeln(options, str(token)) 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass ParserMain(_Main): 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, lexerClassName, parserClass): 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Main.__init__(self) 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClassName = lexerClassName 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClass = None 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.parserClass = parserClass 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setupOptions(self, optParser): 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--lexer", 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="lexerClass", 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=self.lexerClassName 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--rule", 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="parserRule" 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setUp(self, options): 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerMod = __import__(options.lexerClass) 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClass = getattr(lexerMod, options.lexerClass) 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parseStream(self, options, inStream): 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver kwargs = {} 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if options.port is not None: 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver kwargs['port'] = options.port 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if options.debug_socket is not None: 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver kwargs['debug_socket'] = sys.stderr 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = self.lexerClass(inStream) 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenStream = antlr3.CommonTokenStream(lexer) 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = self.parserClass(tokenStream, **kwargs) 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = getattr(parser, options.parserRule)() 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if result is not None: 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if hasattr(result, 'tree') and result.tree is not None: 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.writeln(options, result.tree.toStringTree()) 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.writeln(options, repr(result)) 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass WalkerMain(_Main): 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, walkerClass): 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Main.__init__(self) 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClass = None 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.parserClass = None 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.walkerClass = walkerClass 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setupOptions(self, optParser): 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--lexer", 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="lexerClass", 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=None 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--parser", 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="parserClass", 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=None 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--parser-rule", 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="parserRule", 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default=None 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optParser.add_option( 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "--rule", 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver action="store", 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type="string", 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dest="walkerRule" 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setUp(self, options): 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexerMod = __import__(options.lexerClass) 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.lexerClass = getattr(lexerMod, options.lexerClass) 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parserMod = __import__(options.parserClass) 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.parserClass = getattr(parserMod, options.parserClass) 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parseStream(self, options, inStream): 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = self.lexerClass(inStream) 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenStream = antlr3.CommonTokenStream(lexer) 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = self.parserClass(tokenStream) 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = getattr(parser, options.parserRule)() 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if result is not None: 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert hasattr(result, 'tree'), "Parser did not return an AST" 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodeStream = antlr3.tree.CommonTreeNodeStream(result.tree) 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodeStream.setTokenStream(tokenStream) 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = self.walkerClass(nodeStream) 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = getattr(walker, options.walkerRule)() 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if result is not None: 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if hasattr(result, 'tree'): 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.writeln(options, result.tree.toStringTree()) 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else: 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.writeln(options, repr(result)) 306