Формальные языки, грамматики и основы построения трансляторов. Кревский И.Г - 81 стр.

UptoLike

81
неоднозначная грамматика не может быть LR(k)-грамматикой ни при каком
k.
Следует отметить, однако, что ПС-анализ может быть легко
адаптирован к разбору некоторых неоднозначных грамматик вроде
приведенной выше. При построении такого синтаксического анализатора для
грамматики, содержащей две приведенные выше продукции, мы получим
конфликт переноса/сверткипереноcе else или свертки
stmt if expr then
stmt. Если мы разрешим конфликт в пользу переноса, синтаксический
анализатор будет работать нормально.
Еще одна причина того, что грамматика не является LR, возникает,
когда есть основа, но содержимого стека и очередного входного символа
недостаточно для определения продукции, которая должна использоваться в
свертке. Следующий пример иллюстрирует эту ситуацию
.
Пример 13.e
Предположим, что есть лексический анализатор, который возвращает
символ id для всех идентификаторов, независимо от их использования.
Предположим также, что наш язык вызывает процедуры по именам, с
параметрами взятыми в скобки; тот же синтаксис используется и для работы
с массивами. Поскольку трансляции индексов массива и параметров
процедуры существенно отличаются друг от
друга, мы должны использовать
различные продукции для порождения списка фактических параметров и
индексов. Следовательно, наша грамматика может иметь (среди прочих)
продукции типа
(1) stmt id(parameter_list)
(2) stmt expr := expr
(3) parameter_list parameter_list , parameter
(4) parameter_list parameter
(5) parameter id
(6) expr id(expr_list)
                                                                              81
неоднозначная грамматика не может быть LR(k)-грамматикой ни при каком
k.
     Следует отметить, однако, что ПС-анализ может быть легко
адаптирован    к     разбору   некоторых   неоднозначных       грамматик   вроде
приведенной выше. При построении такого синтаксического анализатора для
грамматики, содержащей две приведенные выше продукции, мы получим
конфликт переноса/свертки – переноcе else или свертки stmt → if expr then
stmt. Если мы разрешим конфликт в пользу переноса, синтаксический
анализатор будет работать нормально.
     Еще одна причина того, что грамматика не является LR, возникает,
когда есть основа, но содержимого стека и очередного входного символа
недостаточно для определения продукции, которая должна использоваться в
свертке. Следующий пример иллюстрирует эту ситуацию.
Пример 13.e
     Предположим, что есть лексический анализатор, который возвращает
символ id для всех идентификаторов, независимо от их использования.
Предположим также, что наш язык вызывает процедуры по именам, с
параметрами взятыми в скобки; тот же синтаксис используется и для работы
с массивами. Поскольку трансляции индексов массива и параметров
процедуры существенно отличаются друг от друга, мы должны использовать
различные продукции для порождения списка фактических параметров и
индексов. Следовательно, наша грамматика может иметь (среди прочих)
продукции типа


       (1)    stmt                id(parameter_list)
       (2)    stmt                expr := expr
       (3)    parameter_list      parameter_list , parameter
       (4)    parameter_list      parameter
       (5)    parameter           id
       (6)    expr                id(expr_list)