プログラミングと工作と

PythonとかPascalとかAVRマイコンとか、コンパイラつくったり電子工作なんかを楽しんでいるおっさんの記録

記号表クラス完成! (たぶん)

やっと、やっとネットがつながった!
引っ越し終わって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}

 

明日は、これを動かせてみたいと思います。