コード例 #1
0
    def parse_base_list(self):
        """BaseList = (BASE)*"""
        tree = Tree('BaseList')

        while not self._scanner.is_end() and not self._scanner.is_next('}'):
            tree.append(self.parse_base())
        return tree
コード例 #2
0
 def parse_exp(self):
     """EXP = ITEM ([+-*/] ITEM)? """
     tree = Tree('EXP') \
         .append(self.parse_item())
     if self._scanner.is_next('OP'):
         tree.append(self._scanner.get_next('OP')) \
             .append(self.parse_item())
     return tree
コード例 #3
0
    def parse_stmt(self):
        """STMT = 'return' id | id '=' EXP | id ('++'|'--') """
        tree = Tree('STMT')
        if self._scanner.is_next('return'):
            tree.append(self._scanner.get_next('return')) \
                .append(self.parse_id())
        else:
            tree.append(self.parse_id())
            if self._scanner.is_next('ASSIGN'):
                tree.append(self._scanner.get_next('ASSIGN')) \
                    .append(self.parse_exp())
            else:
                tree.append(self._scanner.get_next('UnaryOP'))

        return tree
コード例 #4
0
 def parse_cond(self):
     """COND = EXP ('=='|'!='|'<='|'>='|'<'|'>') EXP"""
     tree = Tree('COND') \
         .append(self.parse_exp()) \
         .append(self._scanner.get_next('COND')) \
         .append(self.parse_exp())
     return tree
コード例 #5
0
 def parse_block(self):
     """BLOCK = '{' BaseList '}' """
     tree = Tree('BLOCK') \
         .append(self._scanner.get_next('{')) \
         .append(self.parse_base_list()) \
         .append(self._scanner.get_next('}'))
     return tree
コード例 #6
0
 def parse_base(self):
     """BASE = FOR | STMT ';' """
     tree = Tree('BASE')
     if self._scanner.is_next('for'):
         tree.append(self.parse_for())
     else:
         tree.append(self.parse_stmt())
     tree.append(self._scanner.get_next(';'))
     return tree
コード例 #7
0
 def parse_for(self):
     """FOR = 'for' '(' STMT ';' COND ';' STMT ')' BLOCK """
     tree = Tree('FOR') \
         .append(self._scanner.get_next('for')) \
         .append(self._scanner.get_next('(')) \
         .append(self.parse_stmt()) \
         .append(self._scanner.get_next('END')) \
         .append(self.parse_cond()) \
         .append(self._scanner.get_next('END')) \
         .append(self.parse_stmt()) \
         .append(self._scanner.get_next(')')) \
         .append(self.parse_block())
     return tree
コード例 #8
0
 def parse_item(self):
     """ITEM = id | number """
     tree = Tree('ITEM')
     if self._scanner.is_next('ID'):
         tree.append(self.parse_id())
     else:
         tree.append(self.parse_number())
     return tree
コード例 #9
0
 def parse_prog(self):
     """PROG = BaseList """
     return Tree('PROG').append(self.parse_base_list())
コード例 #10
0
 def parse_number(self):
     """number = [0-9]+"""
     tree = Tree('Number') \
         .append(self._scanner.get_next('NUMBER'))
     return tree
コード例 #11
0
 def parse_id(self):
     """id = [A-Za-z_][A-Za-z0-9_]*"""
     tree = Tree('ID') \
         .append(self._scanner.get_next('ID'))
     return tree