プログラミングと工作と

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

記号表クラスを使う

昨日作った記号表クラスを使って、さっそく記号表を作りたいと思います。

記号表は、構文解析中に作っていきます。
なぜなら、変数を処理する解析中には、その変数の名前や型などをまさに処理しているわけですから。

次に、変数を処理しているメソッド「var_stmts()」を示します。

def var_stmts(self):
        if self.token.token in self.token.keyword:  # ①ここで、token.token には
            self.e.error(4)                         # 変数名が入っている
        self.ids()
        if self.token.token != ':':
            self.e.error(6)
        if self.token.next() not in ['int', 'integer', 'bool', 'boolean']:
            self.e.error(7)    # ②ここのif文で、token.token に型が入っている
        if self.token.next() != ';':
            self.e.error(8)
        if self.token.next() != 'begin':
            if self.token.token in self.token.keyword:
                self.e.error(9)
        if self.token.token not in self.token.keyword:
            self.var_stmts()

上のスクリプト内で番号①②に書いたように、変数名を処理する部分と形名を処理する部分で、それらの値を一時保管しておきます。
その値を記号表クラスの「sym.insert」メソッドに渡してやれば記号表に記録されていきます。

上の②の次のif文で ';' の処理をしているので、ここでひとつの変数処理が終わります。
「sym.insert」メソッドを呼び出すタイミングは、ここになります。


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

def var_stmts(self):
        if self.token.token in self.token.keyword:  # ①ここで、token.token には
            self.e.error(4)                                     # 変数名が入っている
        x = self.ids()
        if self.token.token != ':':
            self.e.error(6)
        if self.token.next() not in ['int', 'integer', 'bool', 'boolean']:
            self.e.error(7)    # ②ここのif文で、token.token に型が入っている
        y = self.token.token
        if self.token.next() != ';':
            self.e.error(8)
        self.sym.insert(x, y, 'mutable', '', 'yes', 1)
        if self.token.next() != 'begin':
            if self.token.token in self.token.keyword:
                self.e.error(9)
        if self.token.token not in self.token.keyword:
            self.var_stmts()
           
インサートメソッドを復習すると、その引数は

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

  • ①の部分で変数 x に変数名を入れておきます。
  • ②の部分で変数 y に型名を入れておきます。
  • インサートメソッドの変数名・型名には x,y をそのまま渡します。
  • 変数は常に変更可能なので、第三引数には変更可能 'mutable' を渡します。
  • 変数宣言時にはまだ値を入れていないので、第四引数には空の文字 '' を渡します。
  • 変数は常に記憶領域を必要とするので、第五引数には 'yes' を渡します。
  • 記憶域の単位は、いまは整数とboolだけなので、 1 を渡します。


これで、変数を記号表へ登録できます(のはずです)!
明日は、定数の記号表への登録を予定しています。