Почему терминалы могут иметь синтезированные атрибуты, но не унаследованные атрибуты?

В книге Ахо и др. «Компиляторы: принципы, методы и инструменты» на стр. 305 говорится: «Терминалы могут иметь синтезированные атрибуты, но не унаследованные атрибуты». Вот мое зависание: если синтезированные атрибуты — это атрибуты, которые могут быть вычислены на основе дочерних элементов узла, а унаследованные атрибуты могут быть вычислены на основе родителя узла и братьев и сестер, то это кажется мне неправильным, потому что, поскольку терминалы были бы листьями узла анализировать дерево, у них не будет детей. Если у них нет дочерних элементов, они не должны иметь синтезированных атрибутов. Точно так же кажется, что, поскольку они являются листьями, вероятно, у них будут родительские узлы и, как следствие, могут быть унаследованы атрибуты. Если бы кто-то мог указать, где я ошибаюсь, это было бы здорово.


person Nick Calabrese    schedule 10.06.2020    source источник


Ответы (1)


Когда я впервые прочитал это в книге о драконах, я тоже был сбит с толку. Но если вы задумаетесь об этом на мгновение, это станет ясно. Синтезированные атрибуты терминалов не поступают из синтаксического анализатора; скорее они исходят от лексера. В качестве примера предположим, что у вас есть терминальная цифра (пример взят из книги о драконах). цифра имеет синтезированный атрибут lexval. Этот синтезированный атрибут исходит не от синтаксического анализатора. Вместо этого он исходит от лексера. Должно быть совершенно ясно, почему терминалы не могут иметь наследуемые атрибуты :)

person xilpex    schedule 10.06.2020
comment
Если вы хотите, чтобы у терминала был унаследованный атрибут, вы можете смоделировать это с помощью нетерминала, единственное производство которого — правая сторона с терминалом в качестве его единственного символа. Таким образом, ограничение не очень важно на практике, но оно удобно для некоторых теоретических утверждений, которые хотят сделать авторы. - person rici; 11.06.2020