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