这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 第一次编程作业 |
这个作业的目标 | 中文编程 |
作业正文 | 如下 |
其他参考文献 |
Github地址:https://github.com/tianzhiyimj/TheFirstHomework
代码行数:108行
分析时间:16小时
编码时间:12-24小时
对题目的思考
拿到题目我首先想到的是前几年“中文编程”的热潮,其中大部分是利用C、C#,Java,Python进行套皮的山寨货。
不过我想能否从底层的层面上进行自定义编程语言,所以我在简书上找到了:自定义编程语言的实现。
其中比较简单的描述了更改语言逻辑的一些要求,如果有想了解的朋友们可以稍微看一看。
我在2月5号进行了初步的尝试,在下图中我试着学习原文章中用JS对运算和比较符进行更改。
然后发现一个问题,当我想要分析巴斯克范式(BNF范式)时我的专业知识已经不够用了,在搜寻资料之后认识到这是一个需要时间去理解和学习的东西。
(附上难以理解的东西)
(以及复杂的AST语法树)
我在认识到自己不足之处后,选择了更为简便的办法,也许是一种投机取巧。C语言中的#define 也就是宏定义手法,可以直接将常见的关键字和符号替换成中文。
2.6日 实践后得出结论:define可以用中文定义,但是Dev-C++5.1.1编译器不能通过运行,我也懒得再去弄适配的编译器,选择更换思路。
颈椎疼,罢工半天_(:з」∠)_
2.7日
将题目需求的功能模块化,每个模块可单独调用。
正则功能还未上线,运算内容有些问题,明天起来再改吧。
1 no = {'零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10} # 中文数字 2 inputs = [] # 输入流 3 var = [] # 变量流 4 data = [] # 数据流 5 regexp = [] # 正则流 6 state = None # 状态 7 8 9 def get(): 10 # 用户输入流 11 inputs.append(input().split()[-1]) 12 print(inputs) 13 14 15 def get_key(v): 16 for k, val in no.items(): 17 if v == val: 18 return k 19 20 21 while True: 22 inputs.append(input().split()[-1]) # 输入存到数据流 23 # 状态机 24 if not state: 25 if inputs[-1] == '整数': 26 state = '定义' 27 elif inputs[-1] in var: 28 state = '运算' 29 elif inputs[-1] == '看看': 30 state = '看看' 31 elif inputs[-1] == '如果': 32 state = '正则' 33 34 if state == '定义': 35 print('到达定义') 36 get() # 变量 37 var.append(inputs[-1]) 38 get() 39 if inputs[-1] == '等于': # 赋值 40 get() 41 data.append(no[inputs[-1]]) 42 state = None # 结束 43 continue 44 45 if state == '运算': 46 print('到达运算') 47 get() 48 if inputs[-1] == '减少': # 负 49 get() 50 data[-1] = get_key(data[-1]-no[inputs[-1]]) 51 elif inputs[-1] == '增加': # 增 52 get() 53 data[-1] = get_key(data[-1]+no[inputs[-1]]) 54 state = None 55 continue 56 57 if state == '看看': 58 print('到达看看') 59 get() 60 if inputs[-1] in var: # 找值 61 print(data[-1]) 62 state = None 63 continue
(附上运行)
最新代码:
1 no = {'零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10} # 中文数目字 2 inputs = [] # 输入流 3 data = {} # 数据流 4 state = None # 业务状态 5 6 7 def get(): 8 # 用户输入流 9 i = input().split(" ") 10 inputs.append(i) 11 # print(inputs) 12 13 14 def get_key(v): 15 for k, val in no.items(): 16 if v == val: 17 return k 18 19 20 while True: 21 get() # 输入存到数据流 22 23 # 状态机 24 if not state: 25 cur = inputs[-1] # 最新输入流 26 if cur[0] == '整数': 27 state = '定义业务' 28 elif cur[0] in list(data.keys()): 29 state = '运算业务' 30 elif cur[0] == '看看': 31 state = '看看业务' 32 elif cur[0] == '如果': 33 state = '正则业务' 34 elif cur[0] == '结束': 35 exit() 36 else: 37 print("状态错误") 38 39 if state == '定义业务': 40 cur = inputs[-1] # 最新输入流 41 key = cur[1] # 变量 42 if cur[2] == '等于': # 赋值 43 data[key] = no[cur[3]] 44 else: 45 print("定义错误") 46 state = None # 业务结束 47 print('定义业务完成') 48 continue 49 50 if state == '运算业务': 51 cur = inputs[-1] # 最新输入流 52 key = cur[0] 53 if cur[1] == '减少': # 负 54 data[key] = data[key] - no[cur[2]] 55 elif cur[1] == '增加': # 增 56 data[key] = data[key] + no[cur[2]] 57 else: 58 print("运算错误") 59 state = None 60 print('运算业务完成') 61 continue 62 63 if state == '看看业务': 64 cur = inputs[-1] # 最新输入流 65 if cur[1] in list(data.keys()): # 找值 66 key = cur[1] 67 print(get_key(data[key])) 68 else: 69 print("变最错误") 70 state = None 71 print('看看业务完成') 72 continue 73 74 if state == '正则业务': 75 cur = inputs[-1] # 最新输入流 76 if cur[1] in list(data.keys()): # 找值 77 if cur[2] == '大于': # 条件 78 condition = no[cur[3]] 79 else: 80 print("条件错误") 81 82 # 正条件 83 if cur[4] == '则' and data[cur[1]] > condition: 84 if cur[5] == '看看': 85 print(cur[6]) 86 elif cur[6] == '增加' and cur[5] in list(data.keys()): 87 data[cur[5]] = data[cur[5]] + no[cur[7]] 88 elif cur[6] == '减少' and cur[5] in list(data.keys()): 89 data[cur[5]] = data[cur[5]] - no[cur[7]] 90 elif cur[5] == '无' or cur[6] == '无': 91 pass 92 else: 93 print('正条件错误') 94 # 负条件 95 elif (cur[7] == '否则' or cur[8] == '否则') and data[cur[1]] < condition: 96 if cur[8] == '看看': 97 print(cur[9]) 98 elif cur[10] == '增加' and cur[9] in list(data.keys()): 99 data[cur[9]] = data[cur[9]] + no[cur[11]] 100 elif cur[10] == '减少' and cur[9] in list(data.keys()): 101 data[cur[9]] = data[cur[9]] - no[cur[11]] 102 elif cur[9] == '无' or cur[10] == '无': 103 pass 104 else: 105 print('负条件错误') 106 else: 107 print("条件错误") 108 else: 109 print("变量错误") 110 state = None 111 print('正则业务完成') 112 continue