記号表クラスを使う
昨日作った記号表クラスを使って、さっそく記号表を作りたいと思います。
記号表は、構文解析中に作っていきます。
なぜなら、変数を処理する解析中には、その変数の名前や型などをまさに処理しているわけですから。
次に、変数を処理しているメソッド「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 を渡します。
これで、変数を記号表へ登録できます(のはずです)!
明日は、定数の記号表への登録を予定しています。