\[$end\] просмотр вперед в LALR

Я пытаюсь понять, как bison строит таблицы для этой простой грамматики:

input: rule ;
rule: rule '+' '1' 
    | '1' ;

Мне удалось рассчитать таблицу переходов LR(1) и наборы элементов, но я не понимаю, как строится и работает состояние 3:

State 3

1 input: rule .  [$end]
2 rule: rule . '+' '1'

'+'  shift, and go to state 5

$default  reduce using rule 1 (input)

Для правила сокращения по умолчанию я должен поместить «r1» во все ячейки таблицы GOTO для каждого символа. Но для правила сдвига я должен поставить «s5» в столбец для терминала «+» (эта ячейка уже содержит «r1»). Для меня это выглядит как сдвиг/уменьшение конфликта. Но не для бизонов. Пожалуйста, объясните, как этот предварительный просмотр появился в этом состоянии, и как это состояние в целом обрабатывается конечным автоматом LR.


person xsp-server-hater    schedule 08.09.2017    source источник


Ответы (1)


  1. default означает "все остальное", а не "все". Другими словами, вы сначала заполняете указанные действия, а затем используете действие по умолчанию для любого другого символа просмотра вперед.

    Если нет действия по умолчанию, действие для любого неуказанного символа просмотра вперед является ошибкой. Действия уменьшения по умолчанию часто используются для уменьшения размера таблицы, где в противном случае алгоритм вызвал бы ошибку. Эта оптимизация может привести к задержке сообщения об ошибке, но ошибка всегда будет обнаружена до того, как будет использован другой ввод, именно потому, что действие при ошибке никогда не заменяется сдвигом по умолчанию. (Действительно, многие генераторы синтаксических анализаторов вообще никогда не используют действия сдвига по умолчанию.)

  2. Если вы посмотрите на грамматику, показанную в начале файла .output, вы увидите, что она была дополнена продукцией:

    0 $accept: input $end
    

    Yacc/bison всегда добавляет такое производство, чтобы убедиться, что весь ввод соответствует начальному символу. (Конечно, нетерминал input будет заменен любым начальным символом, объявленным в директиве %start, или первым нетерминалом в грамматике.)

    В этом правиле нет ничего особенного, кроме того факта, что уменьшение символа $accept приводит к тому, что ввод принимается. (Вы можете видеть это в состоянии 4).

    $end — это специальный терминальный символ, автоматически генерируемый при обнаружении EOF. (Если быть более точным, это терминал, значение токена которого равно 0, который сканер возвращает, чтобы указать конец файла: (f)сканеры, созданные lex, делают это автоматически.

person rici    schedule 08.09.2017
comment
Я не понимаю, как рассчитывается последняя часть расширенного элемента. т.е. как этот символ $end распространяется из правила 0 в состояние 3 (это суть LALR, и я этого не понимаю :( ). Это описано в таких статьях, как - larc.usp.br/~pbarreto/LR.pdf но мне трудно понять - person xsp-server-hater; 08.09.2017
comment
как LOOKAHEAD построен для отдельных производств - stackoverflow.com/a/13731963/4158543 - person xsp-server-hater; 08.09.2017
comment
@xsp: набор под названием LOOKAHEAD в этом ответе не имеет абсолютно никакого отношения к использованию просмотра вперед при разборе LR. Я не думаю, что это подходит для разбора LL, но это другой вопрос. - person rici; 09.09.2017
comment
Чем этот ПРОГНОЗ отличается от этого набора предпросмотра - ? - person xsp-server-hater; 09.09.2017
comment
@xsp: этот упреждающий набор используется для прогнозирования того, какое из нетерминальных производств следует прогнозировать, и, следовательно, содержит возможные первые терминалы для производства. Набор LR LOOKAHEAD используется для принятия решения о сокращении производства и, следовательно, содержит возможные терминалы, которые могут следовать за сокращенным производством в текущем контексте. - person rici; 09.09.2017
comment
@xsp: Упреждающее вычисление LALR(1) хорошо описано в Dragon Book, который является стандартным справочником по построению компилятора. Я рекомендую это. Тем не менее, другим хорошим текстом является книга Dick Grune Parsing Techniques: A Practical Guide, первое издание которой доступно для скачивания. Я не думаю, что смогу объяснить концепции так же хорошо, как если бы это были две книги, поэтому я не буду пытаться. - person rici; 09.09.2017