プログラミングと工作と

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

構文解析部の変更その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 を書いていきます。