我试图遵循“让我们构建一个编译器”教程,以便为自定义汇编语言构建一个基本语言编译器。
目前,我的编译器的规范是:
将来,我希望通过添加其他操作符、逻辑、变量等来扩展编译器。因此,问题是,如何以这样的方式改进我的编译器,使其更容易扩展,并在将来添加新的特性?
以下是代码:
def runProgram(program):
if "+" in program:
index = program.index("+")
try:
return "PUSH " + program[index-1] + "\nPUSH " + program[index+1] + "\nADD"
except:
#"INVALID DIGITS FOR ADDITION"
return "FAIL"
elif "-" in program:
index = program.index("-")
try:
return "PUSH " + program[index-1] + "\nPUSH " + program[index+1] + "\nSUB"
except:
#"INVALID DIGITS FOR SUBTRACTION"
return "FAIL"
else:
try:
int(program)
except:
#INVALID PROGRAM NOT INTERGER
return "FAIL"
return "PUSH " + program
testPrograms = ["3", "19", "5+2", "5-2", "birds", "12+23"]
for x in testPrograms:
print(x + ":\n" + runProgram(x))
此测试的输出:
3:
PUSH 3
19:
PUSH 19
5+2:
PUSH 5
PUSH 2
ADD
5-2:
PUSH 5
PUSH 2
SUB
birds:
FAIL
12+23:
PUSH 2
PUSH 2
ADD
Press any key to continue . . .
†注意:程序将只在操作数的两边添加两位数字。
发布于 2017-09-09 03:45:54
我正在读第二个要求:
接受两个带有"+“或"-”的单数数字†作为输入
结合"12+23“测试用例。这是一个非常好的测试用例,但两位数显然超出了规范所描述的范围。在这种情况下,行为是未指定的,尽管您的程序的行为非常明智。
在runProgram()
中,+
和-
的情况非常相似。您能提供一个以+
/ -
为参数的助手方法吗?
我建议将该职能的最后部分措辞如下:
else:
try:
return 'PUSH ' + int(program)
except ValueError:
return 'FAIL'
in program
程序看起来很脆弱,特别是当您必须处理像5 + -3
这样的程序时。您可能希望尽早标记,并传入一个类似于5,‘+’,-3的列表。或者定义像add
& subtract
这样的函数,并传入5、add
、-3。
https://codereview.stackexchange.com/questions/175146
复制相似问题