Вы давно видите остатки пагубной привычки от программистов на C: предполагается, что символы будут в некоторых списках, и вместо того, чтобы размещать структуры списков отдельно, указатели списков включаются как часть структуры символов. Этот трюк экономит одно выделение на элемент списка, но с затратами: набор списков, в котором может быть символ, является фиксированным, и эта структура сбивает с толку программистов. Если приложение является компилятором, нет причин использовать этот трюк больше. Гораздо понятнее иметь отдельную структуру списка, которая определяется примерно так:
struct ste_list {
struct ste *symbol_table_entry;
struct str_list *next;
};
Вы можете иметь столько их, сколько захотите, и никто не станет мудрее. И внутренние указатели, которые вы находите смущающими, исчезают.
Вы спрашиваете
какая логика стоит за этим?
Часть ответа просто в том, что полезно иметь символы в выделенном списке. Я не могу ответить на вопрос окончательно, не зная больше о конкретном компиляторе. Мое лучшее предположение состоит в том, что запись prev
будет использоваться для реализации вложенных областей (скобки { ... }
в C), но это предположение основано на компиляторах, которые я видел или работал над ними. Так что, возможно, логика заключается в том, что когда встречается закрывающая фигурная скобка, компилятор может следовать по этой ссылке, пока не достигнет ste
во вложенной области видимости. Люди с чуть большим опытом, чем автор изучаемого вами компилятора, обычно помещают эту логику в «абстракцию таблицы символов», которая будет включать такие функции, как enterscope()
и exitscope()
, и детали этих операций будут скрыт от внутреннего представления отдельных записей таблицы символов.