首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python basic算术编译器

Python basic算术编译器
EN

Code Review用户
提问于 2017-09-08 17:05:24
回答 1查看 173关注 0票数 4

我试图遵循“让我们构建一个编译器”教程,以便为自定义汇编语言构建一个基本语言编译器。

目前,我的编译器的规范是:

  • 接受任意长度的单个正整数作为输入。
  • 接受两个带有"+“或"-”的单数数字†作为输入
  • 如果程序只是一个整数,则生成程序集以将其推到堆栈中。
  • 如果程序包含加法或减法,则生成程序集以查找和,并将其推到堆栈中。

将来,我希望通过添加其他操作符、逻辑、变量等来扩展编译器。因此,问题是,如何以这样的方式改进我的编译器,使其更容易扩展,并在将来添加新的特性?

以下是代码:

代码语言:javascript
运行
复制
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))

此测试的输出:

代码语言:javascript
运行
复制
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 . . .

†注意:程序将只在操作数的两边添加两位数字。

EN

回答 1

Code Review用户

发布于 2017-09-09 03:45:54

我正在读第二个要求:

接受两个带有"+“或"-”的单数数字†作为输入

结合"12+23“测试用例。这是一个非常好的测试用例,但两位数显然超出了规范所描述的范围。在这种情况下,行为是未指定的,尽管您的程序的行为非常明智。

runProgram()中,+-的情况非常相似。您能提供一个以+ / -为参数的助手方法吗?

我建议将该职能的最后部分措辞如下:

代码语言:javascript
运行
复制
else:
    try:
        return 'PUSH ' + int(program)
    except ValueError:
        return 'FAIL'

in program程序看起来很脆弱,特别是当您必须处理像5 + -3这样的程序时。您可能希望尽早标记,并传入一个类似于5,‘+’,-3的列表。或者定义像add & subtract这样的函数,并传入5、add、-3。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/175146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档