Compiler construction 关于;让';s构建一个编译器";,杰克·克伦肖

Compiler construction 关于;让';s构建一个编译器";,杰克·克伦肖,compiler-construction,Compiler Construction,(这个问题主要是针对那些读过杰克·克伦肖的教程的人,但由于这是一本众所周知的教程,我认为这是一个合适的问题) 我目前正在阅读杰克·克伦肖的伟大系列《让我们构建一个编译器》 我学到了很多,也很享受。但是我在教程中遇到了一些对我来说没有意义的东西 在学习如何计算布尔表达式时,给出了布尔表达式的组成方式的以下“公式”: <b-expression> ::= <b-term> [<orop> <b-term>]* <b-term> ::= &l

(这个问题主要是针对那些读过杰克·克伦肖的教程的人,但由于这是一本众所周知的教程,我认为这是一个合适的问题)

我目前正在阅读杰克·克伦肖的伟大系列《让我们构建一个编译器》

我学到了很多,也很享受。但是我在教程中遇到了一些对我来说没有意义的东西

在学习如何计算布尔表达式时,给出了布尔表达式的组成方式的以下“公式”:

<b-expression> ::= <b-term> [<orop> <b-term>]*
<b-term> ::= <not-factor> [AND <not-factor>]*
<not-factor> ::= [NOT] <b-factor>
<b-factor> ::= <b-literal> | <b-variable> | <relation>
<relation> ::= | <expression> [<relop> <expression]
<expression> ::= <term> [<addop> <term>]*
<term> ::= <signed factor> [<mulop> factor]*
<signed factor>::= [<addop>] <factor>
<factor> ::= <integer> | <variable> | (<b-expression>)
::=[]*
:=[和]*
:=[不是]
::=  |  | 

::=|[克伦肖本人在这里解释了这一点(我的重点):

现在,回想一下,我们在寄存器D0中使用零或-1来 表示布尔值,也是循环构造所期望的值 要设置为对应的标志。在 68000,事情变得有点棘手。因为循环构造 只在旗子上操作,这会很好(而且效率也很高) 只需设置这些标志,而不将任何内容加载到D0中 对于循环和分支来说是不错的,但是请记住 关系可以用在任何可以使用布尔因子的地方 正在将其结果存储到布尔变量中。因为我们无法在 在这一点上,如何使用结果,我们必须同时考虑这两个因素 案例。比较数字数据很容易…68000有一个 操作…但它设置的是标志,而不是值。是什么 此外,标志将始终设置为相同(如果相等,则为零,等等), 虽然我们需要为每个 不同的重新操作。解决方案可在68000指令Scc中找到, 它将字节值设置为0000或FFFF(这很有趣!) 取决于指定条件的结果。如果 目标字节为D0,我们得到所需的布尔值。 不幸的是,还有最后一个复杂问题:与68000集合中几乎所有其他指令不同,Scc不会重置条件 标记以匹配存储的数据。因此,我们必须执行最后一步, 这是为了测试D0并设置与之匹配的标志。它必须看起来 绕着月球旅行以得到我们想要的东西:我们首先执行 测试,然后测试标志以将数据设置为D0,然后测试D0以设置 又是旗子。这有点像环岛,但它是最棒的 让旗子正确的直截了当的方法,毕竟这只是一个简单的过程 几条说明


(摘自)

每个程序员都应该阅读每个程序员都负担不起的东西。我很想在某个时候阅读它。我知道我们需要一些指令来将布尔值存储在D0中并正确设置标志。但是为什么我们要在
关系中设置标志
,在计算布尔表达式时甚至可能不会调用这些标志?不是吗在表达式的整个计算之后,在
boolExpression
的末尾设置标志更有意义吗?实际上,尽管我没有检查,但我想您会发现,布尔表达式总是调用
关系。