構文解析部の変更その1 ー生成則 11.PARTー
今日から構文解析部の追加部分を作っていきます。
最初は、生成則 11.PART から取り掛かります。
生成則を再掲します。
11.PART→ 'not' PART
→ '(' EXPRESS ')'
→ '+' ( '(' EXPRESS ')' |
INTEGER |
NON_KEY_ID )
→ '-' ( '(' EXPRESS ')' |
INTEGER |
NON_KEY_ID )
→ INTEGER
→ BOOLEAN
→ NON_KEY_ID
これを、愚直にスクリプトへ落としていきます。
まず、PARTが呼ばれるときは、Tokenは'not', '(', '+', '-', 整数, Boolean, 非予約語のいずれかでなければなりません。
生成則の→の直後に来る要素です。
これらの要素が来ない場合、それは間違った呼ばれ方をしているということなので、エラーを出します。
それが、下の最初のif文で処理しているところです。
その後、それぞれの要素がきた場合の処理をif〜elif〜文の並びで処理しています。
スクリプトのPART部分全文を下に示します。
def part(self):
if self.token.token not in ['not', '(', '+', '-']:
if not self.token.token.isdigit:
if self.token.token not in ['true', 'false']:
if self.token.token in self.token.keyword:
self.e.error(3)
if self.token.token == 'not':
self.token.next()
self.part()
elif self.token.token == '(':
self.token.next()
self.express()
if self.token.token != ')':
self.e.error(28)
self.token.next()
elif self.token.token == '+':
self.token.next()
if self.token.token == '(':
self.express()
if self.token.token != ')':
self.e.error(28)
elif self.token.token.isdigit:
self.token.next()
elif self.token.token not in self.token.keyword:
self.token.next()
elif self.token.token == '-':
self.token.next()
if self.token.token == '(':
self.express()
if self.token.token != ')':
self.e.error(28)
elif self.token.token.isdigit:
self.token.next()
elif self.token.token not in self.token.keyword:
self.token.next()
elif self.token.token.isdigit:
self.token.next()
elif self.token.token in ['true', 'false']:
self.token.next()
elif self.token.token not in self.token.keyword:
self.token.next()
明日は、生成則 10.FACTPRS を書いていきます。