在 Nand2Tetris 中实现 Mux 门时出现语法错误

Syntax error when implementing a Mux gate in Nand2Tetris

提问人:Hakeem Mayaki 提问时间:9/12/2023 更新时间:9/12/2023 访问量:36

问:

我正在从事 Nand2Tetris 课程的第一个项目,我必须仅使用 Nand、Not、And 和 Or 门来实现 Mux 门。

我在 Mux.hdl 文件中编写了以下代码:

CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    // Put your code here:
    Not(in=sel, out=not_sel);
    And(a=a, b=not_sel, out=and_a);
    And(a=b, b=sel, out=and_b);
    Or(a=and_a, b=and_b, out=out);
}

但是,当我尝试在硬件模拟器中加载此代码时,我收到以下错误消息:In HDL file C:\Users\BG\Nand2Tetris\projects\01\Mux.hdl Line 18 '' or ')' are expected

我已经检查了我的代码是否有任何拼写错误或语法错误,但我找不到任何错误。我还确保将项目所需的所有文件都放在正确的目录中。我正在使用课程网站上最新版本的硬件模拟器。

我做错了什么?如何修复此错误?

硬件 HDL NAND2TETRIS

评论


答:

1赞 MadOverlord 9/12/2023 #1

首先,在发布代码时,您应该发布整个文件,以便我们知道错误消息指的是哪一行。在您的例子中,第 18 行是代码的第一行,即 Not 门。

我不会立即给你答案,而是会引导你完成解决方案过程,因为它将来帮助你将来将其包含在你的工具包中。

  1. 你在第一行就出错了,这说明你有一个系统性问题。

  2. 错误说“,”“或”)“是预期的(不是您发布的”“或”)“,顺便说一句)。在此过程中的某个时刻,解析器遇到了它期望其中一个分隔符标记的情况。

  3. 您的“不”门似乎已正确形成;它在 () 内列出了电线,它有正确数量的电线,in= 和 out= 是正确的名称,它们用逗号分隔。

  4. 因此,像解析器一样,一次一步执行一个字符,并寻找可以使它说“嘿,我在这里期待一个或一个)的字符,但还有其他东西。

  5. 看不见?不要难过。乍一看我也错过了。我们俩都做了一个假设,这个假设对大多数编程语言都是正确的,但对NAND2Tetris HDL来说却不是这样。

  6. 想想看,这行中最不寻常的角色是什么?它是“_”。您已经从其他编程语言中训练了自己,即 _ 是名称中的有效字符。在这种情况下也是如此吗?

  7. 本书的附录 2 描述了 HDL 语法。第 285 页告诉你什么是有效名称——“任何不以数字开头的字母和数字序列(某些硬件模拟器不允许使用连字符)”。诚然,这可以更好地措辞,以明确不允许使用连字符,因为一些现实生活中的硬件模拟器不允许使用连字符。

  8. 所以这是你的问题。只需将您的线路名称更改为有效的 HDL 名称(例如:not_sel -> notSel),您的代码就会运行。