プログラミングと工作と

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

記号表クラスを使う2

昨日に引き続き、今日は定数の記号表への登録に挑戦します!

定数を処理する構文解析クラスのメソッドconst_stmts()」は次になります。

def const_stmts(self):
        if self.token.token in self.token.keyword:  # ①ここで、token.token には
            self.e.error(10)                        # 定数名が入っている
        if self.token.next() != '=':
            self.e.error(11)
        y = self.token.next()  # ②ここで、token.token に値が入る
        if y in self.token.keyword:
            if not y.isdigit():
                if y not in ['+', '-', 'true', 'false']:
                    self.e.error(12)
        if y in ['+','-']:
            self.token.next()
            if not self.token.token.isdigit:
                self.e.error(13)
            y = y + self.token.token
        if self.token.next() != ';':
            self.e.error(8)
        if self.token.next() in self.token.keyword:
            if self.token.token != 'var':
                if self.token.token != 'begin':
                    self.e.error(14)
        if self.token.token not in self.token.keyword:
            self.const_stmts()

昨日と同じように、上の①の部分で定数名を変数に保存しておきます。
②の値の部分は、もともと変数 y に入れているので、これを利用します。

これらの処理を加えたのが次になります。

def const_stmts(self):
        if self.token.token in self.token.keyword:  # ①ここで、token.token には
            self.e.error(10)                        # 定数名が入っている
        x = self.token.token  #←ここで、変数 x に定数名を保存する。
        if self.token.next() != '=':
            self.e.error(11)
        y = self.token.next()
        if y in self.token.keyword:
            if not y.isdigit():
                if y not in ['+', '-', 'true', 'false']:
                    self.e.error(12)
        if y in ['+','-']:
            self.token.next()
            if not self.token.token.isdigit:
                self.e.error(13)
            y = y + self.token.token
        if self.token.next() != ';':
            self.e.error(8)    # ↓記号表インサートメソッド
        self.sym.insert(x, self.sym.which_type(y), 'immutable',
                        self.sym.which_value(y), 'yes', 1)
        if self.token.next() in self.token.keyword:
            if self.token.token != 'var':
                if self.token.token != 'begin':
                    self.e.error(14)
        if self.token.token not in self.token.keyword:
            self.const_stmts()
        
           
インサートメソッドの引数は次の様になっていましたね。

(変数名、型名、変更可能な変数か?、値、記憶領域を必要とするか?、記憶域の単位数)

  • ①の部分で変数 x に定数名を入れておきます。
  • インサートメソッドの定数名には x をそのまま渡します。
  • 型名は、どの型名に属するかを判別するメソッドに値 y を渡して型名を入れます。
  • 定数は値を変更しないので、第三引数には変更不可 'immutable' を渡します。
  • 第四引数には値を判別するメソッドに y を渡して、値としています。
  • 定数は記憶領域を必要とするので、第五引数には 'yes' を渡します。
  • 記憶域の単位は、いまは整数とboolだけなので、 1 を渡します。


と、ここまで書いていて気づいた。
値を判別するメソッド「which_type()」を作る必要があるじゃないか!
明日は、書き忘れていたメソッドを作って、定数の記号表への登録を完成します。