Home | History | Annotate | Download | only in antlr3
      1 """ANTLR3 runtime package"""
      2 
      3 # begin[licence]
      4 #
      5 # [The "BSD licence"]
      6 # Copyright (c) 2005-2008 Terence Parr
      7 # All rights reserved.
      8 #
      9 # Redistribution and use in source and binary forms, with or without
     10 # modification, are permitted provided that the following conditions
     11 # are met:
     12 # 1. Redistributions of source code must retain the above copyright
     13 #    notice, this list of conditions and the following disclaimer.
     14 # 2. Redistributions in binary form must reproduce the above copyright
     15 #    notice, this list of conditions and the following disclaimer in the
     16 #    documentation and/or other materials provided with the distribution.
     17 # 3. The name of the author may not be used to endorse or promote products
     18 #    derived from this software without specific prior written permission.
     19 #
     20 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 #
     31 # end[licence]
     32 
     33 
     34 import sys
     35 import optparse
     36 
     37 import antlr3
     38 
     39 
     40 class _Main(object):
     41     def __init__(self):
     42         self.stdin = sys.stdin
     43         self.stdout = sys.stdout
     44         self.stderr = sys.stderr
     45 
     46 
     47     def parseOptions(self, argv):
     48         optParser = optparse.OptionParser()
     49         optParser.add_option(
     50             "--encoding",
     51             action="store",
     52             type="string",
     53             dest="encoding"
     54             )
     55         optParser.add_option(
     56             "--input",
     57             action="store",
     58             type="string",
     59             dest="input"
     60             )
     61         optParser.add_option(
     62             "--interactive", "-i",
     63             action="store_true",
     64             dest="interactive"
     65             )
     66         optParser.add_option(
     67             "--no-output",
     68             action="store_true",
     69             dest="no_output"
     70             )
     71         optParser.add_option(
     72             "--profile",
     73             action="store_true",
     74             dest="profile"
     75             )
     76         optParser.add_option(
     77             "--hotshot",
     78             action="store_true",
     79             dest="hotshot"
     80             )
     81         optParser.add_option(
     82             "--port",
     83             type="int",
     84             dest="port",
     85             default=None
     86             )
     87         optParser.add_option(
     88             "--debug-socket",
     89             action='store_true',
     90             dest="debug_socket",
     91             default=None
     92             )
     93 
     94         self.setupOptions(optParser)
     95 
     96         return optParser.parse_args(argv[1:])
     97 
     98 
     99     def setupOptions(self, optParser):
    100         pass
    101 
    102 
    103     def execute(self, argv):
    104         options, args = self.parseOptions(argv)
    105 
    106         self.setUp(options)
    107 
    108         if options.interactive:
    109             while True:
    110                 try:
    111                     input = raw_input(">>> ")
    112                 except (EOFError, KeyboardInterrupt):
    113                     self.stdout.write("\nBye.\n")
    114                     break
    115 
    116                 inStream = antlr3.ANTLRStringStream(input)
    117                 self.parseStream(options, inStream)
    118 
    119         else:
    120             if options.input is not None:
    121                 inStream = antlr3.ANTLRStringStream(options.input)
    122 
    123             elif len(args) == 1 and args[0] != '-':
    124                 inStream = antlr3.ANTLRFileStream(
    125                     args[0], encoding=options.encoding
    126                     )
    127 
    128             else:
    129                 inStream = antlr3.ANTLRInputStream(
    130                     self.stdin, encoding=options.encoding
    131                     )
    132 
    133             if options.profile:
    134                 try:
    135                     import cProfile as profile
    136                 except ImportError:
    137                     import profile
    138 
    139                 profile.runctx(
    140                     'self.parseStream(options, inStream)',
    141                     globals(),
    142                     locals(),
    143                     'profile.dat'
    144                     )
    145 
    146                 import pstats
    147                 stats = pstats.Stats('profile.dat')
    148                 stats.strip_dirs()
    149                 stats.sort_stats('time')
    150                 stats.print_stats(100)
    151 
    152             elif options.hotshot:
    153                 import hotshot
    154 
    155                 profiler = hotshot.Profile('hotshot.dat')
    156                 profiler.runctx(
    157                     'self.parseStream(options, inStream)',
    158                     globals(),
    159                     locals()
    160                     )
    161 
    162             else:
    163                 self.parseStream(options, inStream)
    164 
    165 
    166     def setUp(self, options):
    167         pass
    168 
    169 
    170     def parseStream(self, options, inStream):
    171         raise NotImplementedError
    172 
    173 
    174     def write(self, options, text):
    175         if not options.no_output:
    176             self.stdout.write(text)
    177 
    178 
    179     def writeln(self, options, text):
    180         self.write(options, text + '\n')
    181 
    182 
    183 class LexerMain(_Main):
    184     def __init__(self, lexerClass):
    185         _Main.__init__(self)
    186 
    187         self.lexerClass = lexerClass
    188 
    189 
    190     def parseStream(self, options, inStream):
    191         lexer = self.lexerClass(inStream)
    192         for token in lexer:
    193             self.writeln(options, str(token))
    194 
    195 
    196 class ParserMain(_Main):
    197     def __init__(self, lexerClassName, parserClass):
    198         _Main.__init__(self)
    199 
    200         self.lexerClassName = lexerClassName
    201         self.lexerClass = None
    202         self.parserClass = parserClass
    203 
    204 
    205     def setupOptions(self, optParser):
    206         optParser.add_option(
    207             "--lexer",
    208             action="store",
    209             type="string",
    210             dest="lexerClass",
    211             default=self.lexerClassName
    212             )
    213         optParser.add_option(
    214             "--rule",
    215             action="store",
    216             type="string",
    217             dest="parserRule"
    218             )
    219 
    220 
    221     def setUp(self, options):
    222         lexerMod = __import__(options.lexerClass)
    223         self.lexerClass = getattr(lexerMod, options.lexerClass)
    224 
    225 
    226     def parseStream(self, options, inStream):
    227         kwargs = {}
    228         if options.port is not None:
    229             kwargs['port'] = options.port
    230         if options.debug_socket is not None:
    231             kwargs['debug_socket'] = sys.stderr
    232 
    233         lexer = self.lexerClass(inStream)
    234         tokenStream = antlr3.CommonTokenStream(lexer)
    235         parser = self.parserClass(tokenStream, **kwargs)
    236         result = getattr(parser, options.parserRule)()
    237         if result is not None:
    238             if hasattr(result, 'tree') and result.tree is not None:
    239                 self.writeln(options, result.tree.toStringTree())
    240             else:
    241                 self.writeln(options, repr(result))
    242 
    243 
    244 class WalkerMain(_Main):
    245     def __init__(self, walkerClass):
    246         _Main.__init__(self)
    247 
    248         self.lexerClass = None
    249         self.parserClass = None
    250         self.walkerClass = walkerClass
    251 
    252 
    253     def setupOptions(self, optParser):
    254         optParser.add_option(
    255             "--lexer",
    256             action="store",
    257             type="string",
    258             dest="lexerClass",
    259             default=None
    260             )
    261         optParser.add_option(
    262             "--parser",
    263             action="store",
    264             type="string",
    265             dest="parserClass",
    266             default=None
    267             )
    268         optParser.add_option(
    269             "--parser-rule",
    270             action="store",
    271             type="string",
    272             dest="parserRule",
    273             default=None
    274             )
    275         optParser.add_option(
    276             "--rule",
    277             action="store",
    278             type="string",
    279             dest="walkerRule"
    280             )
    281 
    282 
    283     def setUp(self, options):
    284         lexerMod = __import__(options.lexerClass)
    285         self.lexerClass = getattr(lexerMod, options.lexerClass)
    286         parserMod = __import__(options.parserClass)
    287         self.parserClass = getattr(parserMod, options.parserClass)
    288 
    289 
    290     def parseStream(self, options, inStream):
    291         lexer = self.lexerClass(inStream)
    292         tokenStream = antlr3.CommonTokenStream(lexer)
    293         parser = self.parserClass(tokenStream)
    294         result = getattr(parser, options.parserRule)()
    295         if result is not None:
    296             assert hasattr(result, 'tree'), "Parser did not return an AST"
    297             nodeStream = antlr3.tree.CommonTreeNodeStream(result.tree)
    298             nodeStream.setTokenStream(tokenStream)
    299             walker = self.walkerClass(nodeStream)
    300             result = getattr(walker, options.walkerRule)()
    301             if result is not None:
    302                 if hasattr(result, 'tree'):
    303                     self.writeln(options, result.tree.toStringTree())
    304                 else:
    305                     self.writeln(options, repr(result))
    306