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 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 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 show(): print("****************\nthis is the table:") table = globalvar.get_table() length = len(table) for i in table: if i.typ == "constant": print( str(table.index(i)) + " " + i.name + " " + i.typ + " " + str(i.num)) else: print( str(table.index(i)) + " " + i.name + " " + i.typ + " " + str(i.lev) + " " + str(i.adr)) print("****************") return 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")
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")
def enter(name, typ, s1=0, s2=0): table = globalvar.get_table() item = Item(name, typ, s1, s2) table.append(item)