Код не пройден дважды.В исходном состоянии рис. 3 не может быть скомпилирован, поскольку \v
не имеет определенного значения. (Просто представьте, что это необычная переменная, которая определяется внутри компилятора.)
После того, как вы скомпилировали код на рис. 4, вы заявили, что \v
обозначает 11
.Результирующий компилятор может отобразить \v
на значение, поэтому вы можете определить \v
для обозначения \v
.
Пример некомпилятора с реальными переменными будет выглядеть примерно так:
x = 11;
/* ... */
x = x;
Как только вы определили, что означает x
, вы можете использовать его и даже присвоить его значение себе.Основное отличие синтаксического анализатора состоит в том, что вместо двух объявлений в разных позициях в одном файле определения \v
распространяются на две разные версии компилятора, а вторая компилируется новым компилятором (посколькустарый компилятор не включает это определение).