1)
Ну, таблица символов (ST) может содержать только статическую информацию о символах. Но чтобы собрать эту информацию, нужно понять синтаксическое положение символов в выражении или команде.
Так, например, если ваш лексический анализатор сообщает вам, что он обнаружил токен типа, вам нечего делать в ST. Затем он может найти вас "идентификатор". Таким образом, int i;
может быть командой. Вы должны поместить в свой ST целочисленную переменную. Но если последовательность int i();
, вам нужно определить свой идентификатор i
как функцию, которая возвращает int.
Я совершенно сбит с толку, как у вас уже может быть ST без AST, потому что именно так выполняется ST.
2)
В общем, AST не содержит информацию о символах. Само положение символов в дереве является его наиболее ценной информацией. Так что если вы видите что-то вроде:
int main(void)
{
int i=0;
if(i==0)
{
int i=1;
printf("i=%d\n", i);
}
printf("i=%d\n", i);
}
Поскольку позиция второго i
в AST, ниже дерева, внутри «if», вы можете указать своему ST, что у него 2 i
, и что они являются различными переменными. То, о чем вы не можете догадаться заранее, пока не создадите дерево со всеми символами.
Береги себя,
Бек
PS. Отредактировано:
Лучшая книга, которую я использую:
Компиляторы: принципы, методы и инструменты с градиентом (pkg) (2-е издание)
Альфред В. Ахо, Моника С. Лам, Рави Сетхи, Джеффри Д. Уллман
Издатель: Эддисон Уэсли; 2 издание (15 октября 2007 г.)
ISBN-10: 0321547985
ISBN-13: 978-0321547989