記号表クラス完成! (たぶん)
やっと、やっとネットがつながった!
引っ越し終わって2週間、DTI(←僕の使っているプロバイダ)遅すぎ!!
ネットで引越し手続きできないし、ADSL契約者をないがしろにするし、最悪です。
一時期「ユーザーサポートNo.1!」とか言っていたけれど、まあこんな程度ですわ・・
それはさておき、引越し後の整理もだいぶすんで、やっと落ち着いてきた。
ということで、ソフト製作&ブログ再開です。
中途半端になっていた記号表クラスですが、こまかいメソッドを追加して、一応形にしてみました。
#!/usr/bin/python
# coding: utf-8
class sym:
def __init__(self, token, e):
self.symbol = {}
self.e = e
self.token = token
def check_int(self, st):
i = 0
length = len(st)
intcheck = 'true'
if st[0] == '-':
i = 1
while i < length:
if not st[i].isdigit:
intcheck = 'false'
break
i = i + 1
return intcheck
def check_lit(self, name):
lit = 'false'
if name in ['true', 'false']:
lit = 'true'
if self.check_int(name):
lit = 'true'
return lit
def which_type(self, name):
if self.check_lit(name):
if self.check_int(name):
which_type = 'int_s'
else:
which_type = 'bool_s'
elif name in self.symbol:
which_type = self.symbol[name]['type']
else:
which_type = 'err_s'
self.e.error(25)
return which_type
def which_value(self, name):
if self.check_lit(name):
return name
elif name in self.symbol:
return self.symbol[name]['value']
else:
self.e.error(25)
def type_to_st(self, name):
if name in ['int', 'integer']:
type_to_st = 'int_s'
elif name in ['bool', 'boolean']:
type_to_st = 'bool_s'
else:
type_to_st = 'err_s'
return type_to_st
def insert(self, name, typ, mod, val, alc, uni):
i = 0
id_len = len(name)
while i < id_len:
nam = ''
while i < id_len:
nam = nam + name[i]
i = i + 1
if (i < id_len) and (name[i] == ','):
i = i + 1
break
if nam in self.symbol:
self.e.error(23)
if nam in self.token.keyword:
self.e.error(24)
self.symbol[name] = {'type':typ, 'mode':mod, 'value':val,
'alloc':alc, 'units':uni}
明日は、これを動かせてみたいと思います。