プログラミングと工作と

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

構文解析部の変更その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 に進みます。