Exemplo n.º 1
0
 def semantic_check(self, scope: IdentScope) -> None:
     self.cond.semantic_check(scope)
     self.cond = type_convert(self.cond, TypeDesc.BOOL, None, 'условие')
     self.then_stmt.semantic_check(IdentScope(scope))
     if self.else_stmt:
         self.else_stmt.semantic_check(IdentScope(scope))
     self.node_type = TypeDesc.VOID
Exemplo n.º 2
0
 def semantic_check(self, scope: IdentScope) -> None:
     scope = IdentScope(scope)
     if self.cond == EMPTY_STMT:
         self.cond = LiteralNode('true')
     self.cond.semantic_check(scope)
     self.cond = type_convert(self.cond, TypeDesc.BOOL, None, 'условие')
     self.stmt.semantic_check(IdentScope(scope))
     self.node_type = TypeDesc.VOID
Exemplo n.º 3
0
    def semantic_check(self, scope: IdentScope) -> None:
        if scope.curr_func:
            self.semantic_error(
                "Объявление функции ({}) внутри другой функции не поддерживается"
                .format(self.name.name))
        parent_scope = scope
        self.type.semantic_check(scope)
        scope = IdentScope(scope)

        # временно хоть какое-то значение, чтобы при добавлении параметров находить scope функции
        scope.func = EMPTY_IDENT
        params = []
        for param in self.params:
            # при проверке параметров происходит их добавление в scope
            param.semantic_check(scope)
            params.append(param.type.type)

        type_ = TypeDesc(None, self.type.type, tuple(params))
        func_ident = IdentDesc(self.name.name, type_)
        scope.func = func_ident
        self.name.node_type = type_
        try:
            self.name.node_ident = parent_scope.curr_global.add_ident(
                func_ident)
        except SemanticException as e:
            self.name.semantic_error("Повторное объявление функции {}".format(
                self.name.name))
        self.body.semantic_check(scope)
        self.node_type = TypeDesc.VOID
Exemplo n.º 4
0
 def semantic_check(self, scope: IdentScope) -> None:
     self.val.semantic_check(IdentScope(scope))
     func = scope.curr_func
     if func is None:
         self.semantic_error('Оператор return применим только к функции')
     self.val = type_convert(self.val, func.func.type.return_type, self,
                             'возвращаемое значение')
     self.node_type = TypeDesc.VOID
Exemplo n.º 5
0
 def semantic_check(self, scope: IdentScope) -> None:
     if not self.program:
         scope = IdentScope(scope)
     for expr in self.exprs:
         expr.semantic_check(scope)
     self.node_type = TypeDesc.VOID