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
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")
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 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 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() # 递归进行<过程说明部分>子程序
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
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")
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") # 成功运行
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")