def abstractToConcreteType(abstract_type): if abstract_type == 'T': return [ AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, b)) for b in BASIC_TYPES ] elif abstract_type in BASIC_TYPES: return [ AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, abstract_type)) ] elif abstract_type == '[T]': return [ AST.LISTTYPE(type=AST.TYPE(val=AST.BASICTYPE( type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, b)))) for b in BASIC_TYPES ] elif abstract_type in ['[' + x + ']' for x in BASIC_TYPES]: return [ AST.LISTTYPE(type=AST.TYPE(val=AST.BASICTYPE(type_id=Token( Position(), TOKEN.TYPE_IDENTIFIER, abstract_type[1:-1])))) ] elif abstract_type in VOID_TYPE: return [Token(Position(), TOKEN.TYPE_IDENTIFIER, "Void")] else: raise Exception( "Unknown abstract type encountered in builtin operator table: %s" % abstract_type)
def typecheck_stmts(func, symbol_table, ext_table): for vardecl in func['def'].vardecls: _, vardecl.expr = typecheck(vardecl.expr, vardecl.type.val, symbol_table, ext_table, func) stmts = list(reversed(func['def'].stmts)) ast_boolnode = AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "Bool")) while len(stmts) > 0: stmt = stmts.pop() if type(stmt.val) == AST.ACTSTMT: typecheck_actstmt(stmt.val, symbol_table, ext_table, func) elif type(stmt.val) == AST.IFELSE: for b in stmt.val.condbranches: if b.expr is not None: _, b.expr = typecheck(b.expr, ast_boolnode, symbol_table, ext_table, func) stmts.extend(list(reversed(b.stmts))) elif type(stmt.val) == AST.LOOP: if stmt.val.cond is not None: _, stmt.val.cond = typecheck(stmt.val.cond, ast_boolnode, symbol_table, ext_table, func) if stmt.val.init is not None: typecheck_actstmt(stmt.val.init, symbol_table, ext_table, func) if stmt.val.update is not None: typecheck_actstmt(stmt.val.update, symbol_table, ext_table, func) stmts.extend(list(reversed(stmt.val.stmts))) elif type(stmt.val) == AST.RETURN: if stmt.val.expr is not None: _, stmt.val.expr = typecheck(stmt.val.expr, func['type'].to_type.val, symbol_table, ext_table, func)
def tokenToNode(token): if token.typ == TOKEN.INT: node = AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "Int")) node._start_pos = Position() return node elif token.typ == TOKEN.CHAR: node = AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "Char")) node._start_pos = Position() return node elif token.typ == TOKEN.BOOL: node = AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "Bool")) node._start_pos = Position() return node elif token.typ == TOKEN.STRING: node = AST.LISTTYPE(type=AST.TYPE(val=AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "Char")))) node._start_pos = Position() return node elif token.typ == TOKEN.EMPTY_LIST: node = AST.BASICTYPE(type_id=Token(Position(), TOKEN.TYPE_IDENTIFIER, "[]")) node._start_pos = Position() return node else: raise Exception('Unexpected token type encountered')
def BasicType(): a = yield BasicTypeChoice #print(a) return AST.BASICTYPE(type_id=a)
importlist=None), AST.IMPORT(name=Token(None, TOKEN.IDENTIFIER, "math"), importlist=[ AST.IMPORTNAME(name=Token(None, TOKEN.IDENTIFIER, "power"), alias=Token(None, TOKEN.IDENTIFIER, "pow")) ]) ], decls=[ AST.VARDECL( type=None, id=Token(None, TOKEN.IDENTIFIER, "temp"), expr=AST.DEFERREDEXPR(contents=[Token(None, TOKEN.INT, 2)])), AST.VARDECL( type=AST.TYPE(val=AST.BASICTYPE( type_id=Token(None, TOKEN.TYPE_IDENTIFIER, "Char")) ), # TODO make this work for type node id=Token(None, TOKEN.IDENTIFIER, "hey"), expr=AST.DEFERREDEXPR( contents=[Token(None, TOKEN.CHAR, 'a')])), AST.TYPESYN(type_id=Token(None, TOKEN.TYPE_IDENTIFIER, "String"), def_type=AST.TYPE(val=AST.LISTTYPE(type=AST.TYPE( val=AST.BASICTYPE(type_id=Token( None, TOKEN.TYPE_IDENTIFIER, "Char")))))), AST.FUNDECL( kind=FunKind.INFIXL, fixity=Token(None, TOKEN.INT, 4), id=Token(None, TOKEN.OP_IDENTIFIER, "%%"), params=[ Token(None, TOKEN.IDENTIFIER, "x"), Token(None, TOKEN.IDENTIFIER, "y")