编译原理—无符号数的识别Python

Sara/Sarah ·
更新时间:2024-09-21
· 936 次阅读

编译原理—无符号数的识别Python

1.理解无符号数的识别过程
2.理解无符号数的状态矩阵变化过程,如下图:(图片引自老师PPT,仅供学习使用,侵权删)

w-----> 尾数累加器(初值为0) p-----> 指数数累加器(初值为0) n------>十进制小数位数计数器(初值为0,扫视到小数点后开始计数) d-----> 0,1, 2, 3, 4, 5, 6, 7, 8, 9 . -----> 小数点 e-----> 用来记录十进制指数的符号(初值为1,遇到E或e后的符号时再改为-1) other----除此之外的(下图0状态中ther为other)
在这里插入图片描述上图会对以下情况截取识别为正确: 1213ddas 211e132dsf 12.132dsd 在代码中进行修正

1213ddas------>当前状态为1 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 w,其他返回"error"。
211e132dsf------>当前状态为6 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 (w * (10 ** (e * p - n))),其他返回"error"。
12.132dsd------>当前状态为2 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 (w * (10 ** (e * p - n))),
其他返回"error"。

基本步骤:
1.输入字符串(python中输入均为str),识别串是否为无符号数 数字字符串即可
2.在字符串后加一个空格,用来判断串是否结束
3.选取每一位,将状态和取到的字符通过上表进行变化
4.输出结论

源码:

""" state: 0, 1, 2, 3, 4, 5, 6, error, 正确 """ d = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] def zore(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ state = 0 if i in d: w = w * 10 + int(i) state = 1 return state,i, w, n, p, e elif i == ".": state = 3 return state,i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def one(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: w = w * 10 + int(i) state = 1 return state,i, w, n, p, e elif i == ".": state = 2 return state,i, w, n, p, e elif i == "e" or i == "E": state = 4 return state, i, w, n, p, e elif i == " ": print(w) state = "正确" return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def two(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: n = n + 1 w = w * 10 + int(i) state = 2 return state, i, w, n, p, e elif i == "e" or i == "E": state = 4 return state, i, w, n, p, e elif i == " ": print(w * (10 ** (e * p - n))) state = "正确" return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def three(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: n = n + 1 w = w * 10 + int(i) state = 2 return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def four(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: p = p * 10 + int(i) state = 6 return state,i, w, n, p, e elif i == "+": state = 5 return state,i, w, n, p, e elif i == "-": e = -1 state = 5 return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def five(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: p = p * 10 + int(i) state = 6 return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e def six(i, w, n, p, e): """ :param i: 当前取到的字符 :param w: 尾数累加器 :param n: 十进制数小数位数累加器 :param p: 指数累加器 :param e: 十进制指数的符号 :return: state, i, w, n, p, e """ if i in d: p = p * 10 + int(i) state = 6 return state, i, w, n, p, e if i == " ": print(w * (10 ** (e * p - n))) state = "正确" return state, i, w, n, p, e else: state = "error" print("%s <---- %s" % (i, state)) return state, i, w, n, p, e if __name__ == "__main__": w = 0 # 尾数累加器 p = 0 # 指数累加器 n = 0 # 十进制数小数位数累加器 e = 1 # 十进制指数的符号 str_float = input("请输入一个串(判断是否为无符号数):") str_float_1 = str_float + " " # 字符串后加一个空格用来判断串已结束 d = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] state = 0 # state为状态 for i in str_float_1: if state == 0: state,i, w, n, p, e = zore(i, w, n, p, e) elif state == 1: state, i, w, n, p, e = one(i, w, n, p, e) elif state == 2: state, i, w, n, p, e = two(i, w, n, p, e) elif state == 3: state, i, w, n, p, e = three(i, w, n, p, e) elif state == 4: state, i, w, n, p, e = four(i, w, n, p, e) elif state == 5: state, i, w, n, p, e = five(i, w, n, p, e) elif state == 6: state, i, w, n, p, e = six(i, w, n, p, e) print("%s<-----%s" % (str_float, state))

测试:
输出将原有的无符号数 数字字符串转换成 float输出,在python中float类型小数位数变多后会出现损失
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现损失,如下图:(第一行为输入,第二行为计算出来的值,出现损失,第三行为结论)
在这里插入图片描述


作者:Elf.苏洛曦



编译原理 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号