如何在“让我们构建一个编译器”教程11中处理一元减号?

时间:2014-01-10 07:39:44

标签: compiler-construction

在教程11中处理一元减号的一般想法是什么?似乎没有对Negate()的调用。

我跟随Crenshaw"让我们建立一个编译器"当然,只有在C和x86中。在教程11中,扫描仪被重构了一点,在重构过程中,作者说他们已经简化了对一元减号的处理。然而,我的C版本(我认为是一个(相当?)忠实的转录)似乎根本没有处理一元减号 - 它没有通过我的测试!

我跟随http://www.compilers.iecc.com/crenshaw/tutor11.txt

2 个答案:

答案 0 :(得分:2)

我浏览了教程11,我看不到它处理一元减去的地方。我对那个特定编译器系列的回忆是,他在处理一元减号时来回走动,可能是因为他的Pascal背景。标准/旧帕斯卡在处理一元减号方面略有不同。例如,请参阅此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 ] .

(语法片段来自:http://www.felix-colibri.com/papers/compilers/pascal_s_grammar/pascal_s_grammar.html

它似乎只在simple_expression的开头处理一元减号,而不像许多类C语言那样处理因子。

无论如何,该系列确实在最后添加了一元减号。 : - )

最后,我遇到了您可能喜欢的链接: http://code.google.com/p/letsbuildacompiler/

他在C中发展Tiny。在完成本教程之前,不要公平地窥视: - )

答案 1 :(得分:0)

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

if IsAddop(Token) then
   Clear
else
   Term;