コード例 #1
0
 def visit(self, node:ast.Assignment, scope:Scope, errors):
     try:
         instanceType = scope.getTypeFor(node.instance.name)
         exprType = self.visit(node.expr, scope, errors)
         if not instanceType < exprType :
             raise CheckSemanticError(f'{tb} doesn\'t conform {node.return_type}')
         return exprType
     except:
         raise CheckSemanticError(f'Symbol {node.instance.name} not defined in the Scope.')
コード例 #2
0
 def visit(self, node:ast.DynamicDispatch, scope:Scope, errors):
     instanceType = scope.getTypeFor(node.instance)
     if not instanceType.is_method(node.method):
        raise CheckSemanticError(f'method {node.method} not defined')
     argsType = instanceType.get_method_args(node.method)
     if len(argsType) != len(node.arguments):
         raise CheckSemanticError(f'{node.method} require {len(argsType)} arguments')
     for x, y in argsType, node.arguments:
         t = self.visit(y, scope, errors)
         if not t < x:
             raise CheckSemanticError(f'{str(t)} doesn\'t conform {str(x)}')
     method = instanceType.get_method(node.method)
     return  method.return_type
コード例 #3
0
 def visit(self, node: ast.Assignment, scope: Scope):
     instance_type = scope.getTypeFor(node.instance.name)
     expr_type = self.visit(node.expr, scope)
     if expr_type.name == 'SELF_TYPE':
         r_type = scope.getType(scope.classname)
         if r_type < instance_type:
             return r_type
         raise CheckSemanticError(
             f'{r_type} doesn\'t conform {instance_type}')
     if not expr_type < instance_type:
         raise CheckSemanticError(
             f'{expr_type} doesn\'t conform {instance_type}')
     node.static_type = expr_type
     return expr_type
コード例 #4
0
 def visit(self, node: ast.Object, scope: Scope):
     node.static_type = scope.getTypeFor(node.name)
     return scope.getTypeFor(node.name)
コード例 #5
0
 def visit(self, node:ast.Object, scope:Scope, errors):
     return scope.getTypeFor(node.name)