我一直在重读http://cm.bell-labs.com/who/ken/trust.html,我似乎无法用第二阶段的垂直标签来理解第二阶段的概念。我向你们提出的问题是:现在通过包含\ v转义字符来检查字符两次吗?因为我看到它的方式是安装了这个新编译器,当使用\时,它将通过图3中的代码,然后在return('\ _v')语句中,然后将调用图4中的代码,该代码返回垂直选项卡的真实ASCII表示。这不会减慢编译时间,虽然它可以更好地表示当前编译器吗?如果您需要我重新解释我的问题,请告诉我。干杯!
答案 0 :(得分:0)
代码不会遍历两次。在初始状态下,无法编译图3,因为\v
没有定义的含义。 (只需将其视为编译器内部定义的奇特变量。)
编译完图4的代码后,您已声明\v
代表11
。生成的编译器可以将\v
映射到值,因此您可以将\v
定义为\v
。
具有实变量的非编译器示例将是这样的:
x = 11;
/* ... */
x = x;
一旦定义了x
代表的内容,您就可以使用它,甚至将其值分配给自己。与解析器的主要区别在于,\v
的定义不是在同一文件中的不同位置,而是分布在两个不同版本的编译器中,第二个由新编译器编译(因为旧编译器不包含此定义。)