编译原理—无符号数的识别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,