August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
我们在计算器程序的设计中使用了四个函数,一个函数用于读入单词,其他三个函数分别实现文法的三条规则:
注意:每个函数只处理表达式的一个特定部分,将其他工作留给其他函数,这样可以简化函数的实现。如同每个人处理自己所擅长的问题,将其他不熟悉的问题留给同事完成一样。
这些函数应该具体做什么呢?每个函数应该根据其所实现的文法规则,调用其他文法函数,并利用get_token()获得规则所需要的单词。例如,当primary()函数实现“(Expression)”规则时,它必须调用
这些语法分析函数的返回值又应该是什么呢?这个问题实际等价于——我们想得到什么结果呢?例如,对于2+3,expression()应该返回5。毕竟,所有信息都包含其中了。这就是我们应该做的!这样做实际上回答了前面列表中最复杂的问题:“如何表示45+5/7才有利于计算它的值?”我们在读入表达式时就计算它的值,而不是把它的某种表示形式存储到内存中。这个小小的想法其实是一个重要的突破!我们如果让expression()返回某种复杂的形式,随后再进行计算的话,程序规模会是直接计算值的版本的4倍。直接计算表达式的值会节省我们80%左右的工作量。
剩下的那个函数是get_token():由于它只处理单词,而不是表达式,因此它不能返回一个子表达式的值。例如,“+”和“(”不是表达式。因此,它必须返回一个Token对象。因此有: ...