Exemple #1
0
def while_statement():  # <当循环语句> 的分析子程序
    if globalvar.get_symbol() == token.WHILE:
        cx1 = len(globalvar.get_code())  # 判断条件的p-code位置
        print("watch me ,判断条件在" + str(cx1))
        token.getsym()
        condition()
        cx2 = len(globalvar.get_code()) - 1 + 1  # 意思为循环结束的下一个位置
        generator.gen("jpc", 0, 0)  # 这里尚且不知道要跳转到哪,所以先把第二个参数置为0
        if globalvar.get_symbol() == token.DO:
            token.getsym()
            statement()
            generator.gen("jmp", 0, cx1)
            code = globalvar.get_code()  # 构造一个p-code副本
            if code[cx2].operator == 'jpc':
                code[cx2].s2 = len(globalvar.get_code())  # 这里修改了之前未决定的位置
            else:
                print("error!!!!!!!!"
                      "&&&&&&&&&&&&&&&&&&&&&&"
                      "$$$$$$$$$$$$$$$$$$$$$4")
            globalvar.set_code(code)
            print("this is while_statement")
        else:  # 没有do的情况
            error_handling.error(18)  # 应为do,弹出错误信息18
            # print("error in while_statement() -->no do")
            return 0
    else:
        print("error in while_statement() -->no while")
        return 0
Exemple #2
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()")
Exemple #3
0
def if_statement():  # <条件语句> 的分析子程序
    if globalvar.get_symbol() == token.IF:
        token.getsym()
        condition()
        if globalvar.get_symbol() == token.THEN:
            token.getsym()
            generator.gen("jpc", 0, 0)
            cx1 = len(globalvar.get_code()) - 1  # 记录当前p-code位置
            statement()
            code = globalvar.get_code()  # 创建一个code副本
            if code[cx1].operator == 'jpc':
                code[cx1].s2 = len(globalvar.get_code())
            else:
                print("error$$$$$$$$$$$")
            globalvar.set_code(code)  # 更新p-code列表
            print("this is if_statement")
            if globalvar.get_symbol() == token.ELSE:
                token.getsym()
                generator.gen("jpc", 0, 0)
                cx2 = len(globalvar.get_code()) - 1  # 记录当前p-code位置
                statement()
                code = globalvar.get_code()  # 创建一个code副本
                if code[cx2].operator == 'jpc':
                    code[cx2].s2 = len(globalvar.get_code())
                else:
                    print("error$$$$$$$$$$$")
                globalvar.set_code(code)
        else:
            error_handling.error(16)  # 应该为then,弹出错误信息16
            # print("error in if_statement() -->no then")
            return 0
    else:
        print("error in if_statement() -->no if")
        return 0
Exemple #4
0
def relation_operator():  # <关系运算符> 的分析子程序
    x = globalvar.get_symbol()
    # 判断是否为六种关系运算符的一种
    if x == token.LESSTHANSY or x == token.NOLESSTHANSY or x == token.MORETHANSY or x == token.NOMORETHANSY or x == token.NOEQUSY or x == token.EQUSY:
        token.getsym()
        print("this is relation_operator")
    else:  # 该符号不是关系运算符
        error_handling.error(20)  # 应为关系运算符,弹出错误信息20
    return x
Exemple #5
0
def repeat_statement():
    cx1 = len(globalvar.get_code())  # 判断条件的p-code位置
    token.getsym()
    statement()
    while globalvar.get_symbol() == token.SEMISY:
        token.getsym()
        statement()
    if globalvar.get_symbol() == token.UNTIL:
        token.getsym()
        generator.gen("jpc", 0, cx1)
    else:
        error_handling.error(19)
Exemple #6
0
def constant_declare():  # <常量说明部分> 的分析子程序
    if globalvar.get_symbol() == token.CONST:  # 虽然这句好像没什么用
        token.getsym()
        constant_def()  # 调用<常量定义>的分析子程序
        while globalvar.get_symbol() == token.COMMASY:  # 判断有没有","
            token.getsym()  # 有的话向前读一格
            constant_def()  # 接着判断是不是常量定义
        if globalvar.get_symbol() == token.SEMISY:  # 如果有";",该条<常量说明部分>结束
            token.getsym()
            print("this is constant_declare")
        else:  # 没有;的情况
            error_handling.error(5)
            # print("error in constant_declare() -->no semi symbol")
            return 0
    else:
        print("error in constant_declare()")
        return 0
Exemple #7
0
def mixed_statement():  # <复合语句> 的分析子程序
    if globalvar.get_symbol() == token.BEGIN:
        token.getsym()
        statement()
        ##print("here*********")
        while globalvar.get_symbol() == token.SEMISY:
            token.getsym()
            statement()
        if globalvar.get_symbol() == token.END:
            token.getsym()
            print("this is mixed_statement")
        else:  # 没有end标记
            error_handling.error(17)  # 应该为'end',弹出错误信息17
            # print("error in mixed_statement()--no end")
            # print(globalvar.get_stri()[globalvar.get_pointer() - 3:globalvar.get_pointer() + 3])
            return 0
    else:
        print("error in mixed_statement()--no begin")
Exemple #8
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()")
Exemple #9
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()  # 递归进行<过程说明部分>子程序
Exemple #10
0
def constant_def():  # <常量定义> 的分析子程序
    ret = identifier()  # 调用标识符的分析子程序
    if ret == 0:  # 当得出不是标识符时
        error_handling.error(4)  # const后面应该是标识符,弹出错误信息4
    if globalvar.get_symbol() == token.EQUSY:  # 判断是否为等于号
        token.getsym()  # 读入一个字符
        ret = unsigned_int()  # 判断是否为数字
        if ret:  # ret 为真的时候表示确实是数字
            if globalvar.get_num() > token.MAX_NUM:
                error_handling.error(30)  # 数字过大,弹出错误信息30
                exit()
            tab.enter(globalvar.get_id_name(), "constant", globalvar.get_num())
            print("this is constant_def")
        else:  # ret 为假的时候表示后面跟的不是数字
            error_handling.error(2)  # =后面跟的不是数,弹出错误信息2
    elif globalvar.get_symbol() == token.ASSIGNSY:
        error_handling.error(1)  # 应该是=而不是:=,弹出错误信息1
    else:
        error_handling.error(3)  # 标识符后面应该是=,弹出错误信息3
        print("error in constant_def()  -->no equal symbol")
        return 0
Exemple #11
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")  # 成功运行
Exemple #12
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")
Exemple #13
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")
Exemple #14
0
def write_statement():  # <写语句>的分析子程序
    if globalvar.get_symbol() == token.WRITE:
        token.getsym()
        if globalvar.get_symbol() == token.LPARSY:  # 判断是否有左括号
            token.getsym()
            expression()
            generator.gen("wrt", 0, 0)  # 生成输出指令
            while globalvar.get_symbol() == token.COMMASY:
                token.getsym()
                expression()
                generator.gen("wrt", 0, 0)  # 生成输出指令
            if globalvar.get_symbol() == token.RPARSY:
                token.getsym()
                print("this is write_statement")
            else:  # 缺少右括号
                error_handling.error(22)  # 缺少右括号,弹出错误信息22
                # print("error in write_statement()--no )")
                return 0
        else:
            error_handling.error(40)  # 缺少左括号,弹出错误信息40
            # print ("error in write_statement()--no (")
            # return 0
            return 0
    else:
        print("error in write_statement()--no write")
        return 0


# def alpha(): # <字母> 的分析子程序
#     print("this is alpha")
#
#
# def digit(): # <数字> 的分析子程序
#     print("this is digit")

# 下面是主程序

# token.getsym()
# program()
#tab.show()
#generator.show()
#tab.show()
#print(globalvar.get_pointer())

#stri="if"
#token.getsym()
#print(stri)
#print(symbol)
#statement()

# globalvar.show()
# globalvar.set_stri("if if#####")
# print("***************")
# globalvar.show()
# token.getsym()
# print("***************")
# statement()
# globalvar.show()
# token.getsym()
# statement()

#token.getsym()
#statement()
#print(globalvar.get_symbol())
# token.getsym()
# print(globalvar.get_symbol())
Exemple #15
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