記号表クラスを使う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()」を作る必要があるじゃないか!
明日は、書き忘れていたメソッドを作って、定数の記号表への登録を完成します。