コード例 #1
0
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)
コード例 #2
0
ファイル: typechecker.py プロジェクト: W-M-T/gsc
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)
コード例 #3
0
ファイル: typechecker.py プロジェクト: W-M-T/gsc
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')
コード例 #4
0
ファイル: parser.py プロジェクト: W-M-T/gsc
def BasicType():
    a = yield BasicTypeChoice
    #print(a)
    return AST.BASICTYPE(type_id=a)
コード例 #5
0
ファイル: AST_prettyprinter.py プロジェクト: W-M-T/gsc
                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")