Example #1
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()")
Example #2
0
def identifier():  # <标识符> 的分析子程序
    name = globalvar.get_id_name()
    if globalvar.get_symbol() == token.IDSY:  # 判断是不是标识符
        token.getsym()  # 是的话读下一个token
        print("this is identifier")
        print(globalvar.get_id_name())
        return globalvar.get_id_name()
    else:
        print("error in identifier()")
        return 0
    return name
Example #3
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()")
Example #4
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
Example #5
0
NOEQUSY = 37  # <>
FINAL = 233  # .
MAX_NUM = 2047

token = ""  # 表示当前的字符串
ch = ""  # 表示当前字符
# pointer = 0

# stri = grammar.stri# 输入的字符串
# symbol = grammar.symbol
# num = grammar.num
stri = globalvar.get_stri()
symbol = globalvar.get_symbol()
num = globalvar.get_num()
pointer = globalvar.get_pointer()
id_name = globalvar.get_id_name()


def getsym():
    global ch, reserve, IDSY, INTSY, token, pointer, symbol, stri, num, id_name
    global IDSY, INTSY, PLUSSY, MINUSSY

    stri = globalvar.get_stri()
    symbol = globalvar.get_symbol()
    num = globalvar.get_num()
    pointer = globalvar.get_pointer()

    clearToken()  # 将之前的字符串置为为空
    getchar()
    while isSpace() or isNewline() or isTab():
        getchar()