【问题标题】:Building assembler with dictionaries用字典构建汇编程序
【发布时间】:2015-07-13 18:15:15
【问题描述】:

今年夏天,我正在学习 nand2tetris 课程,目前正在进行第 6 章项目(构建汇编程序)。我之所以选择 Python,是因为这本可爱的字典的存在。问题是我似乎无法正确工作/创建/访问一个。在遵循本章的 API 时,他们为汇编程序推荐了 3 个不同的类,即 Parser 类、SymbolTable 类和 Code 类。

我们构建的机器具有以下指定的内存。已专门用于预定义符号的位置。

因此使用以下 PreAllocated 内存位置:

SP - (hex 00000, bin 0000000000000000)
LCL - (hex 00001, bin 0000000000000001)
ARG - (hex 00002, bin 0000000000000010)
THIS - (hex 00003, bin 0000000000000011)
THAT - (hex 0004, bin 0000000000000100)
R0-R15 - (hex 000[0-15], bin 000000000000[0-1111])
SCREEN - (hex 04000, bin 0100000000000000)
KBD - (hex 06000, bin 0110000000000000)

我想以表本身就是对象的方式创建类,并且在实例化时自然分配这些 {'key': value} 对。

symbolTable.py:

class symbolTable(object):
def __init__(self):
        self.table = {'SP': 0000000000000000, 'LCL': 0000000000000001,
                      'ARG': 0000000000000010, 'THIS': 0000000000000011,
                      'THAT': 0000000000000100, 'R0': 0000000000000000,
                      'R1': 0000000000000001, 'R2': 0000000000000010,
                      'R3': 0000000000000011, 'R4': 000000000000100,
                      'R5': 0000000000000101, 'R6': 0000000000000110,
                      'R7': 0000000000000111, 'R8': 0000000000001000,
                      'R9': 0000000000001001, 'R10': 0000000000001010,
                      'R11': 0000000000001011, 'R12': 0000000000001100,
                      'R13': 0000000000001101, 'R14': 0000000000001110,
                      'R15': 0000000000001111, 'SCREEN': 0100000000000000,
                      'KBD': 0110000000000000};

在继续添加属性之前,我试图简单地创建这个东西。然而,当我打开并运行我的主文件时,main.py:

__author__ = 'Cheech Wife'
import symbolTable
newTable = symbolTable.SymbolTable() 
print newTable

我什么都没得到:

C:\Python27\python.exe "C:/Users/Cheech Wife/Desktop/cs 271/Assembler_ch6/symbolTable.py"

进程以退出代码 0 结束

从我所读的内容来看,文件分离不应该是问题,并且在使用 C++ 时,我非常喜欢分区,并希望文件保持不同。那我做错了什么?

是我试图将我的类的对象作为字典本身的错误吗?当我尝试实例化事物时,我做错了什么吗?

【问题讨论】:

  • 您运行的是main.py 还是symbolTable.py
  • 您在粘贴实际代码吗?因为案例不完全匹配。
  • 还有一个缩进问题(见__init__)。无论如何,在修复这些错误后,代码可以正常工作。
  • 如果你解决了你的语法问题,这很好用。这些常量不是二进制的,而是八进制的,所以你可能也想修复它。哦,没有分号,这是斯巴达。我的意思是,python。

标签: python dictionary


【解决方案1】:

您不需要末尾的分号或字典。 C/C++ 语法残余。 您在 SymbolTable 中的定义需要缩进。

您得到退出代码 0,因为您运行的是 symbotTable.py 而不是 main.py。

你的 main.py 应该告诉你你的对象符号表在哪里。不是它的内容。 类似:

最后你的数字将被解释为八进制而不是二进制。看看Binary numbers in Python

【讨论】:

  • 太棒了。谢谢你。我忘记了当你说 run.C:\Python27\python.exe "C:/Users/Cheech Wife/Desktop/cs 271/Assembler_ch6/main.py" 时,pyCharm 不仅仅运行 main
  • 另外,一个简单的 for 循环是否足以打印?还是我需要传统的 getter 和 setter?
  • SymbolTable 中的表可以通过以下方式直接访问:" 'newTable = SymbolTable.SymbolTable() print(newTable.table)' ' 这将打印字典表 如果你想打印单个元素你必须访问它们。'print(newTable.table["SP"])' 或者你可以遍历它们'for a in newTable.table: print (a)' 至于在我看来使用 getter 或 setter,这是你的打电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2011-02-12
  • 1970-01-01
  • 2011-01-24
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多