def defvar(prefix, loc): names = [] while True: name = prefix + src.gettok() names.append(name) if not src.match(','): break src.need(':') volume = '' if src.match('['): volume = expr2str(hier21()) src.need(']') level = 0 while src.match('*'): level += 1 t = src.gettok() #if t == 'hash': # t = 'char*' varlist = [] for name in names: varlist.append({'isa': 'var', 'name': name, 'type': t, 'level': level, 'volume': volume}) # [a, b, c] -> [LOCAL] loc.extend(varlist) return varlist
def defconst(prefix, loc): name = prefix + src.gettok() src.need('=') value = expr() const = {'isa': 'const', 'name': name, 'value': expr2str(value['value']), 'type': value['value']['type']} loc.append(const) return const
def doimport(): imp = [] imp.append(src.gettok()) while src.match('.'): imp.append(src.gettok()) name = '' ispath = False if len(imp) > 1: # get path from DOT. record name = imp[0] for s in imp[1:]: name = (name + '/' + s) ispath = True else: name = imp[0] # check if not imported for i in unit['import']: if i['name'] == name: print('already imported') return filename = name + '.cstar' if os.path.isfile(filename): # UNIT unit['import'].append({'name': name, 'extern': False}) import_unit(filename) elif os.path.isdir(name): # PACKAGE unit['import'].append({'name': name, 'extern': False}) import_package(name) else: # UNKNOWN unit['import'].append({'name': name, 'extern': True})
def defun(): global params, local_consts, local_vars params = [] local_consts = [] local_vars = [] name = src.gettok() spec = '' if name[0] == '_': spec = 'static ' if name != 'main': name = unit['name'] + '_' + name src.need('(') if not src.match(')'): while True: arg_name = src.gettok() arg_lvl = 0 while src.match('*'): arg_lvl += 1 arg_type = src.gettok() params.append({'isa': 'param', 'name': arg_name, 'type': arg_type, 'level': arg_lvl}) if not src.match(','): break src.need(')') src.need('{') global func_type func_type = 'void' # see doreturn code = cpnd() unit['func'].append({'isa': 'func', 'spec': spec, 'name': name, 'params': params, 'type': func_type, 'code': code, 'local consts': local_consts, 'local vars': local_vars}) params = [] local_consts = [] local_vars = []
def hier0(): if src.match('('): k = hier18() src.need(')') return k t = src.token() #print('HIER: %s' % t) if t[0].isdigit(): _type = 'integer' if src.token()[0:2] == '0x': _type = 'unsigned' value = int(src.token(), 0) src.gettok() return {'isa': 'atom', 'type': _type, 'value': value} elif t[0].isalpha() or t[0] == '_': a = str(src.token()) c = None ref = None # find in arglist for arg in params: if a == arg['name']: ref = arg c = a break # if not found in args if c == None: # find in locals for lv in local_vars: if a == lv['name']: ref = lv c = a break # if not arg or local find global: if c == None: b = unit['name'] + '_' + a for em in unit['var']: if b == em['name']: ref = em c = b break for em in unit['const']: if b == em['name']: ref = em c = b break for em in unit['func']: if b == em['name']: ref = em c = b break if c == None: c = a undef(c) src.gettok() return {'isa': 'atom', 'type': 'name', 'value': c, 'ref': ref} elif t[0] == '#': value = str(src.token()) src.gettok() return {'isa': 'atom', 'type': 'hashtag', 'value': '"' + value + '"'} elif t[0] == '"': value = str(src.token()) src.gettok() return {'isa': 'atom', 'type': 'string', 'value': value} return {'isa': 'unknown'}