構文解析部の変更その2 ー生成則 10.FACTORSー
今日は、生成則 10.FACTORS を書いていきます。
生成則を再掲します。
10.FACTORS → MULT_LEV_OP PART FACTORS
→ λ
なんか、短くて簡単そうな気がします。
ちなみに、MULT_LEV_OP というのも生成則 14.になります。
これも再掲しておきます。
14.MULT_LEV_OP → '*'
→ 'div'
→ 'mod'
→ 'and'
掛け算と同じ優先順位の演算子ですね。
それでは、スクリプトへ落としていきましょう!
def factors(self):
if self.token.token in ['<>', '=', '>=', '<=', '<',
'>', ')', ';', '+', '-', 'or']:
return
if self.token.token not in ['*', 'div', 'mod', 'and']:
self.e.error(27)
self.token.next()
self.part()
self.factors()
FACTORSは、MULT_LEV_OPで始まる以外は素通り(→ λ)するので、掛け算レベル以外の演算子とカッコの終わり')' と文の終わり';' で素通りしてもらいます。
最初のif文がこれにあたる処理ですが、「なにもしないで関数を抜ける」でちょっと悩みました。
グーグル先生に聞きまくったところ、ただの return で良さそうなのですが、ちょっと自信がありません。
実際に動かす時に確認が必要だと思います。
そのあとの if文で、FACTORS → MULT_LEV_OP、つまり、最初は掛け算レベルの演算子が来るはずだから、そうでなければエラーを出しています。
その後は、生成規則通りに関数PARTとFACTORSを呼んでいます。
生成則 10.FACTORS は、以上です。
きのうと比べると簡単でしたね。
明日は、生成則 9.FACTOR に進みます。