Beispiel #1
0
def block():  # <分程序>的分析子程序
    index = 3
    globalvar.set_index(3)
    tx0 = len(globalvar.get_table()) - 1
    cx0 = generator.gen("jmp", 0, 0)  # 保存当前p-code指令在code列表中的位置

    while globalvar.get_symbol() == token.CONST:  # 判断是否为 常量说明部分
        constant_declare()
    while globalvar.get_symbol() == token.VAR:  # 判断是否为 变量说明部分
        var_declare()
    index = globalvar.get_index()  # 在这保存一下应该分配的大小
    while globalvar.get_symbol() == token.PROCEDURE:  # 判断是否为 过程说明部分
        proc_declare()
    # 是应该在这建符号表吗??
    code = globalvar.get_code()  # 获取一个p-code表的副本
    table = globalvar.get_table()  # 获取一个符号表的副本
    code[cx0].s2 = len(globalvar.get_code())
    if not globalvar.get_level() == 0:  # 判断一下是不是最外层的程序,如果是的话则不修改表
        table[tx0].adr = len(
            globalvar.get_code())  # 将符号表中过程的adr值改为在p-code中的初始位置
        globalvar.set_table(table)
    generator.gen("int", 0, index)
    statement()  # 调用<语句>的分析子程序
    generator.gen("opr", 0, 0)
    print("this is block")
Beispiel #2
0
def read_statement():  # <读语句> 的分析子程序
    if globalvar.get_symbol() == token.READ:
        token.getsym()
        if globalvar.get_symbol() == token.LPARSY:  # 判断是否为左括号
            token.getsym()
            name = identifier()
            i = tab.position(name)
            table = globalvar.get_table()
            if i == -1:  # 返回值为-1代表没有在符号表里找到
                error_handling.error(11)  # 读语句中的标识符未声明,弹出出错信息11
                # print ("error in read_statement()")
            else:
                if not table[i].typ == "variable":
                    error_handling.error(12)  # 不可向常量或着过程赋值,弹出错误信息12
                    # print("error in assign_statement-->not a variable")
                    return 0
                generator.gen("red",
                              globalvar.get_level() - table[i].lev,
                              table[i].adr)
            while globalvar.get_symbol() == token.COMMASY:
                token.getsym()
                name = identifier()
                i = tab.position(name)
                table = globalvar.get_table()
                if i == -1:  # 返回值为-1代表没有在符号表里找到
                    error_handling.error(11)  # 读语句中的标识符未声明,弹出出错信息11
                    #print ("error in read_statement()")
                else:
                    if not table[i].typ == "variable":
                        error_handling.error(12)  # 不可向常量或着过程赋值,弹出错误信息12
                        # print("error in assign_statement-->not a variable")
                        return 0
                    generator.gen("red",
                                  globalvar.get_level() - table[i].lev,
                                  table[i].adr)
            # print("here******")
            # print(globalvar.get_pointer())
            # print(globalvar.get_symbol())
            if globalvar.get_symbol() == token.RPARSY:  # 判断是不是右括号
                token.getsym()
                print("this is read_statement")
            else:
                error_handling.error(22)  # 缺少右括号,弹出错误信息22
                print(globalvar.get_symbol())
                # print("error in read_statement()--no )")
                return 0
        else:
            error_handling.error(40)  # 缺少左括号,弹出错误信息40
            # print ("error in read_statement()--no (")
            exit()
    else:
        print("error in read_statement()--no read")
        return 0
Beispiel #3
0
def position(name):
    level = globalvar.get_level()  # 获取当前的层数
    index = globalvar.get_index()
    table = globalvar.get_table()
    for i in range(len(table) - 1, -1, -1):  # 查询顺序好像有问题
        # if not table[i].typ == 'constant':
        #if table[i].lev == level:  # 为了防止找之前同层过程的变量
        if table[i].name == name:
            return table.index(table[i])  # 这边应该可以优化
    #elif table[i].lev == level - 1:
    #   level -= 1
    #   i += 1
    # else:  # 常量的时候直接跳过

    return -1  # 当没有找到的时候 返回-1
Beispiel #4
0
def show():
    print("****************\nthis is the table:")
    table = globalvar.get_table()
    length = len(table)
    for i in table:
        if i.typ == "constant":
            print(
                str(table.index(i)) + " " + i.name + " " + i.typ + " " +
                str(i.num))
        else:
            print(
                str(table.index(i)) + " " + i.name + " " + i.typ + " " +
                str(i.lev) + " " + str(i.adr))
    print("****************")
    return 0
Beispiel #5
0
def assign_statement():  # <赋值语句> 的分析子程序
    name = identifier()
    i = tab.position(name)
    table = globalvar.get_table()
    if i == -1:
        error_handling.error(11)  # 赋值语句中的标识符未声明,弹出出错信息11
        # print("error in assign_statement-->no such variable")
        return 0
    else:
        if not table[i].typ == "variable":
            error_handling.error(12)  # 不可向常量或着过程赋值,弹出错误信息12
            # print("error in assign_statement-->not a variable")
            return 0
    if globalvar.get_symbol() == token.ASSIGNSY:
        token.getsym()
        expression()
        generator.gen("sto",
                      globalvar.get_level() - table[i].lev, table[i].adr)
    else:
        error_handling.error(13)  # 应为赋值运算符,弹出错误信息13
    print("this is assign_statement")
Beispiel #6
0
def factor():  # <因子>的分析子程序
    if globalvar.get_symbol() == token.IDSY:
        name = identifier()
        i = tab.position(name)
        table = globalvar.get_table()
        if i == -1:  # 返回值为-1代表没有在符号表里找到
            error_handling.error(11)  # 因子中的标识符未声明,弹出出错信息11
            # print ("error in factor()")
        else:
            if table[i].typ == "constant":
                generator.gen("lit", 0, table[i].num)  # 产生指令,将第二个参数取到栈顶
            elif table[i].typ == "variable":
                generator.gen("lod",
                              globalvar.get_level() - table[i].lev,
                              table[i].adr)  # 将变量的值取到栈顶,第一个参数为层差,第二个参数为偏移量
            else:  # 是过程标识符
                error_handling.error(21)
                # print("error in factor()")

    elif globalvar.get_symbol() == token.INTSY:
        unsigned_int()
        if globalvar.get_num() > token.MAX_NUM:
            error_handling.error(30)
            return 0
        generator.gen("lit", 0, globalvar.get_num())
    elif globalvar.get_symbol() == token.LPARSY:  # 如果是左括号
        token.getsym()
        expression()
        if globalvar.get_symbol() == token.RPARSY:
            token.getsym()
        else:  # 没有右括号
            error_handling.error(22)  # 没有右括号,弹出错误信息22
            # print ("error in factor-->no right par")
    else:
        print("error in factor()")
        print(globalvar.get_pointer())
        return 0
    print("this is factor")  # 成功运行
Beispiel #7
0
def proc_call_statement():  # <过程调用语句> 的分析子程序
    if globalvar.get_symbol() == token.CALL:
        token.getsym()
        name = identifier()  # 获取当前标识符的名字
        if name == 0:
            error_handling.error(14)  # call后面应为标识符,弹出错误信息14
            return 0
        i = tab.position(name)
        table = globalvar.get_table()
        if i == -1:
            error_handling.error(11)  # 过程调用语句中的标识符未声明,弹出出错信息11
            # print("error in proc_call_statement()-->no such name")
            return 0
        else:
            if not table[i].typ == 'procedure':
                error_handling.error(15)
                return 0
                # print("error in proc_call_statement()-->not a procedure")
        generator.gen("cal",
                      globalvar.get_level() - table[i].lev, table[i].adr)
        print("this is proc_call_statement")
    else:
        print("error in proc_call_statement()-->no call")
Beispiel #8
0
def enter(name, typ, s1=0, s2=0):
    table = globalvar.get_table()
    item = Item(name, typ, s1, s2)
    table.append(item)