Извините, возможно, это немного абстрактный вопрос. Но это может помочь мне понять использование таблиц символов. Предположим, я хочу реализовать упрощенный компилятор C #, и вот фрагмент кода, который я хочу скомпилировать:
// Let simplified version of c# language does not contain access modifiers
// (all by default public)
class Foo
{
int Sum(int a, int b) { return a + b; }
};
Вот упрощенный AST кода:
ClassNode (name:Foo)
└─╴FuncNode (name:Sum, type:(a:int,b:int)->int)
└─╴OperatorNode (name:+, type:(int,int)->int)
├─╴ArgNode (name:a, type:int)
└─╴ArgNode (name:b, type:int)
Другими словами, у нас есть ClassNode
, который объявляет класс Foo. У этого ClassNode
есть один FuncNode
, который объявляет функцию Sum
. FuncNode
содержит тело, которое в свою очередь является простым арифметическим выражением.
Цепочка таблиц символов может выглядеть следующим образом:
(Global symbol table)
┌────────┬──────────┬───────────┐
│SymName │Type │Attr │
├────────┼──────────┼───────────┤
│Foo │class:Foo │ClassDecl │
└────────┴──────────┴───────────┘
\/
(Inner symbol table)
┌────────┬────────────────────┬──────────────────┐
│SymName │Type │Attr │
├────────┼────────────────────┼──────────────────┤
│Sum │func:(int,int)->int │InstanceFuncDecl │
└────────┴────────────────────┴──────────────────┘
\/
(Inner symbol table)
┌────────┬─────┬─────────┐
│SymName │Type │Attr │
├────────┼─────┼─────────┤
│a │Int │Argument │
│b │Int │Argument │
└────────┴─────┴─────────┘
Должна ли таблица символов содержать информацию о объявлениях классов / функций или она должна содержать только информацию о локальных переменных / полях и т. Д.? Я полагаю, что она должна содержать и то и другое, потому что такую информацию можно использовать для генерации вызова рекурсивных функций (вместо извлечения типа функции из AST (это потребует обхода AST) мы можем быстро извлечь ее из таблицы символов?)
Или, может быть, достаточно просто использовать типизированное абстрактное синтаксическое дерево без использования каких-либо таблиц символов?
- Должны ли узлы AST содержать ссылки на записи таблиц символов? Например, чтобы избежать дублирования информации о типах?
- Может быть, моя цепочка таблиц символов неверна? Я предполагаю, что у каждого объявления класса / функции должна быть своя собственная таблица символов?