Exemplo n.º 1
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
Exemplo n.º 2
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")
Exemplo n.º 3
0
def var_declare():  # <变量说明部分>的分析子程序
    level = globalvar.get_level()
    index = globalvar.get_index()
    if globalvar.get_symbol() == token.VAR:  # 虽然这句好像没什么用
        token.getsym()  # 读入一个字符
        ret = identifier()  # 判断是否为标识符
        if ret == 0:  # 不是标识符的情况
            error_handling.error(4)  # var后面应该是标识符,弹出错误信息4
        tab.enter(globalvar.get_id_name(), "variable", level,
                  index)  # 把这个变量加入符号表
        index += 1  # 相对地址+1
        while globalvar.get_symbol() == token.COMMASY:  # 判断接下来是不是逗号,即是不是还有变量
            token.getsym()
            identifier()
            tab.enter(globalvar.get_id_name(), "variable", level,
                      index)  # 把这个变量加入符号表
            index += 1
            # print("index="+str(index))
        if globalvar.get_symbol() == token.SEMISY:  # 判断是否为分号,即语句是否结束
            token.getsym()
            print("this is var_declare")
            print(index)
            globalvar.set_index(index)
            # print("ggggggindex=" + str(globalvar.get_index()))
            # globalvar.set_level(level) # 但是这边应该不会改level的数值
        else:
            error_handling.error(5)  # 结束的时候没有分号,弹出错误信息5
            # print("error in var_declare() -->no semi symbol")
            return 0
    else:
        print("error in var_declare()")
Exemplo n.º 4
0
def proc_head():  # <过程首部>的分析子程序
    level = globalvar.get_level()
    index = globalvar.get_index()
    if globalvar.get_symbol() == token.PROCEDURE:  # 判断当前字符是不是 procedure
        token.getsym()
        ret = identifier()  # 判断是否为标识符
        if ret == 0:
            error_handling.error(4)  # procedure 后面应该是标识符,弹出错误信息4
        tab.enter(globalvar.get_id_name(), "procedure", globalvar.get_level(),
                  globalvar.get_index())  # 在这将过程添加进符号表
        globalvar.set_index(globalvar.get_index() + 1)  # 更新数据的指针
        if globalvar.get_symbol() == token.SEMISY:  # 判断当前token是不是 ;
            token.getsym()
            print("this is proc_head")
        else:
            error_handling.error(5)  # 结束的时候没有分号,弹出错误信息5
    else:
        print("error in proc_head()")
Exemplo n.º 5
0
def proc_declare():  # <过程说明部分>的分析子程序
    proc_head()  # 调用<过程首部>分析子程序
    print("head success!!!!")
    globalvar.set_level(globalvar.get_level() + 1)
    block()  # 调用<分程序>分析子程序
    globalvar.set_level(globalvar.get_level() - 1)
    print(globalvar.get_stri()[globalvar.get_pointer() -
                               3:globalvar.get_pointer() + 3])
    print("block success!!!")
    if globalvar.get_symbol() == token.SEMISY:
        token.getsym()
        print("this is proc_declare")
    else:
        error_handling.error(5)  # 结束的时候没有分号,弹出错误信息5
        # print("error in proc_declare()-->no semi symbol")
        print(globalvar.get_stri()[globalvar.get_pointer() -
                                   3:globalvar.get_pointer() + 3])
        return 0
    while globalvar.get_symbol() == token.PROCEDURE:  # 判断还有没有<过程首部>
        proc_declare()  # 递归进行<过程说明部分>子程序
Exemplo n.º 6
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
Exemplo n.º 7
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")
Exemplo n.º 8
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")  # 成功运行
Exemplo n.º 9
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")