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()")
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
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()")
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
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()