1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#!/usr/bin/env python
""" cdecl.py - parse c declarations
(c) 2002, 2003, 2004, 2005 Simon Burton <simon@arrowtheory.com>
Released under GNU LGPL license.
version 0.xx
"""
import sys
class Symbols(object):
def __init__(self,parent=None,verbose=False):
self.verbose = verbose
self.parent=parent # are we a nested namespace?
self.lookup = {} # identifiers
self.tags = {} # struct, union, enum tags
def __str__(self):
return "Symbols(%s,%s)"%(self.lookup,self.tags)
def __getitem__(self,key):
try:
item = self.lookup[key]
except KeyError:
item = None
#if self.parent is not None:
#item = self.parent[item]
## self[key] = item # cache
#if self.verbose: print "%s.get('%s')='%s'"%(self,key,item)
return item
def __setitem__(self,key,val):
#if self.verbose: print "%s.set('%s','%s')"%(self,key,val)
assert val is not None
self.lookup[key] = val
def set_tag(self,key,val):
#if self.verbose: print "%s.set_tag(%s,%s)"%(self,key,val)
assert len(key)
self.tags[key] = val
def deep_get_tag(self,key):
try:
item = self.tags[key]
except KeyError:
item = None
if self.parent is not None:
item = self.parent.deep_get_tag(key)
#if self.verbose: print "%s.get_tag(%s)=%s"%(self,key,item)
return item
def get_tag(self,key):
try:
item = self.tags[key]
except KeyError:
item = None
#if self.verbose: print "%s.get_tag(%s)=%s"%(self,key,item)
return item
###################################################################
#
###################################################################
#
class ParseError(Exception):
def __init__(self,*e):
self.e = e
def __str__(self):
return "".join(map(str,self.e))
class Parser(object):
def parse_error(self,lexer,reason="?",*blah):
sys.stderr.write( "%s.parse_error()\n"%self.deepstr() )
sys.stderr.write( "at line %s: %s\n"%(lexer.lno+1,reason) )
sys.stderr.write( lexer.err_string() )
raise ParseError(reason,*blah)
def expected_error(self,lexer,*l):
self.parse_error( lexer, "expected %s, got '%s'"\
%(" or ".join(map(repr,l)),lexer.tok))
def consume(self,lexer,tok):
if lexer.tok != tok:
self.expected_error(lexer, tok)
lexer.get_token()
def parse_enter(self,lexer):
#return
self.start_lno=lexer.lno
self.file=lexer.so_file
def parse_leave(self,lexer):
#return
self.lines = lexer.lines[self.start_lno:max(lexer.lno,self.start_lno+1)]
###################################################################
#
###################################################################
#
|