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
的末尾设置标志更有意义吗?实际上,尽管我没有检查,但我想您会发现,布尔表达式总是调用关系。