Compiler construction “一元负号”是如何处理的;让';让我们构建一个编译器;教程11?

Compiler construction “一元负号”是如何处理的;让';让我们构建一个编译器;教程11?,compiler-construction,Compiler Construction,在教程11中,关于处理一元负数的一般想法是什么?似乎没有调用Negate() 我正在学习克伦肖的“让我们构建一个编译器”课程,只学习C和x86。在教程11中,扫描器被重构了一点,在重构过程中,作者说他们简化了一元负号的处理。然而,我的C版本(我认为是一个(相当?)忠实的抄本)似乎根本不能处理一元负数——它通过了我的测试 下面是我浏览了教程11,没有看到它在哪里处理一元负号。我对那个特定编译器系列的记忆是,他来回处理一元负号,可能是因为他的帕斯卡背景。标准/旧帕斯卡在处理一元负号时有些不同。例如,

在教程11中,关于处理一元负数的一般想法是什么?似乎没有调用
Negate()

我正在学习克伦肖的“让我们构建一个编译器”课程,只学习C和x86。在教程11中,扫描器被重构了一点,在重构过程中,作者说他们简化了一元负号的处理。然而,我的C版本(我认为是一个(相当?)忠实的抄本)似乎根本不能处理一元负数——它通过了我的测试


下面是我浏览了教程11,没有看到它在哪里处理一元负号。我对那个特定编译器系列的记忆是,他来回处理一元负号,可能是因为他的帕斯卡背景。标准/旧帕斯卡在处理一元负号时有些不同。例如,请参见以下Pascal-S语法片段:

     expression= simple_expression [ relational_operator simple_expression ] .
      relational_operator= '=' | '<>' | '<' | '<=' | '>' | '>=' .
      simple_expression= [ '+' | '-' ] term { addition_operator term } .
        addition_operator= '+' | '-' | OR .
        term= factor { multiplication_operator factor } .
          multiplication_operator= '*' | '/' | DIV | MOD | AND .
          factor= NUMBER | STRING | CONSTANT_NAME
              | variable_access | function_designator
              | '(' expression ')' | NOT factor .
            function_designator= FUNCTION_NAME [ actual_parameter_list ] .
expression=simple\u expression[关系\u操作符simple\u expression]。
关系|u运算符='='''|''='。
简单_表达式=['+'|'-']项{加法运算项}。
加法|运算符='+'|'-'|或。
项=因子{乘法运算因子}。
乘法|运算符=“*”|“/”| DIV | MOD |和。
系数=数字|字符串|常数|名称
|变量访问功能指示符
|“(“表达式”)”而不是因子。
函数\指示器=函数\名称[实际\参数\列表]。
(语法片段来自:)

它似乎只在简单的_表达式的开头处理一元负号,而不像许多类似C的语言那样在因子中处理

在任何情况下,序列都会在末尾加上一元负号。:-)

最后,我遇到了一个您可能喜欢的链接:


他在C中发展出了微小的能力。在你完成教程之前,没有公平的窥视:-)

处理一元负号的想法是用从0中减去来代替它,即-N变成(0-N)。在过程表达式的以下代码中,通过调用Clear插入0:

if IsAddop(Token) then
   Clear
else
   Term;