Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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})
Esempio n. 4
0
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 = []
Esempio n. 5
0
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'}