#parsing #compiler-construction #grammar #semantics #parse-tree
#синтаксический анализ #компилятор-конструкция #грамматика #семантика #синтаксический анализ-дерево
Вопрос:
В настоящее время я пытаюсь нарисовать поток атрибутов для этой грамматики атрибутов.
decl → ID decl tail
decl.t := decl tail.t
decl tail.in tab := insert (decl.in tab, ID.n, decl tail.t)
decl.out tab := decl tail.out tab
decl tail → , decl
decl tail.t := decl.t
decl.in tab := decl tail.in tab
decl tail.out tab := decl.out tab
decl tail → : ID ;
decl tail.t := ID.n
decl tail.out tab := decl tail.in tab
Но я не понимаю, что insert (decl.in tab, ID.n, decl tail.t)
это значит.
Моим первым предположением было, что это будет что-то похожее на функцию insert() в Python.
Но, насколько я знаю, Python insert()
принимает два параметра, но в этой грамматике атрибутов он принимает три параметра decl.in tab, ID.n, decl tail.t
, поэтому мое первоначальное предположение здесь явно неверно.
Я новичок в разработке компиляторов, и мне трудно понять значения некоторых семантических функций, которые я никогда раньше не видел. (например ReduceTo()
)
Что это insert (decl.in tab, ID.n, decl tail.t)
значит?
Есть ли список подобных семантических функций, которые мне нужно знать или запоминать?
Ответ №1:
По предположению, целью является добавление объявленной переменной с указанным типом в таблицу символов («вкладка»).
Однако для целей анализа потока атрибутов вам на самом деле не нужно знать, что insert
это делает. Вам нужно только знать, что для нее требуются определенные значения (ее аргументы), поэтому эти атрибуты должны быть доступны для вычисления атрибута, присвоенного из возвращаемого значения функции.
Для грамматик атрибутов нет предопределенных семантических функций, поэтому вам не нужно беспокоиться о запоминании их списка. Конкретные семантические функции, используемые в конкретном приложении грамматики атрибутов, будут определены самим этим приложением.