Ответ 1
РЕДАКТИРОВАТЬ (или фактически переписать): Предложение, которое вы просили уточнить, является основным шариком! Мне нужно было немного переосмыслить язык и автоматы, чтобы выбрать этот шарик. Я нашел эти лекционные заметки очень полезными в этом отношении.
Также не упрощается определение терминов в терминах расширения сверху вниз, в то время как самый правый вывод обычно используется при синтаксическом анализе снизу вверх.
Я буду использовать следующую грамматику выражения, чтобы проиллюстрировать:
expr -> expr + term | term term -> term * factor | factor factor -> NUMBER | ( expr )
- A правосторонняя форма - это условная форма, которая может быть достигнута с помощью самого правого вывода, что является еще одним способом описания повторного расширения только самого правого нетерминального символа при движении сверху вниз. Это самый правый вывод, и поэтому все формы в нем являются право-условными формами:
expr -> expr + term -> expr + term * factor -> expr + term * NUMBER -> expr + factor * NUMBER -> expr + NUMBER * NUMBER -> expr + term + NUMBER * NUMBER -> expr + NUMBER + NUMBER * NUMBER -> term + NUMBER + NUMBER * NUMBER -> NUMBER + NUMBER + NUMBER * NUMBER
-
A префикс условной формы (как правой, так и другой) представляет собой последовательность входных символов, которая сводится к нулю или более ведущих символов этой условной формы. Пустая последовательность тривиально является префиксом каждой условной формы, а полная последовательность символов, составляющих условную форму, также тривиально является ее префиксом.
-
A простая фраза - это расширение одного нетерминального символа, который содержит место в условной форме. Например,
term * factor
- простая фраза, потому что она является расширениемterm
, а самаterm
встречается в трех постановках. -
дескриптор для условной формы - самая левая простая фраза в этой форме. (Я признаю, что здесь термин "дескриптор" несколько запутан.) В самом правом деривации дескриптор легко идентифицировать - это последовательность символов, которая была получена из недавно расширенного нетерминала. Если вы работаете снизу вверх, как это делает парсер с уменьшением сдвига, ручка - это простая фраза, которая должна быть уменьшена далее. (Прочитайте таблицу деривации сверху снизу вверх, посмотрев, какие символы были уменьшены, чтобы понять, что я имею в виду.)
-
A жизнеспособный префикс правой-условной формы - это префикс, который не распространяется за пределы этого дескриптора формы - другими словами, этот префикс действителен и не содержит приводимых простых фраз, с возможным исключением самого дескриптора, если указанный префикс проходит точно до конца дескриптора.
С точки зрения парсера с уменьшением сдвига, если у вас есть жизнеспособный префикс в стеке, вы еще не были вынуждены либо сократить (возможно, неполную) простую фразу поверх стека до нового нетерминала или не удается выполнить синтаксический анализ, если он не может быть уменьшен. Если смещение следующего символа приведет к чему-то другому, кроме жизнеспособного префикса, вы должны в этот момент либо уменьшить, либо сбой.
Если вы анализируете контекстно-свободный язык, существует довольно удобное свойство, которое помогает в создании парсинга с уменьшением сдвига с таблицей: набор всех жизнеспособных префиксов контекстно-свободного языка сам по себе является регулярным языком!. Таким образом, вы можете создать конечный автомат, который распознает правильный язык жизнеспособных префиксов и будет использовать его для определения того, когда нужно сдвигать и когда уменьшать. Эта комбинация стека и машины конечного состояния - это, по сути, пусковой автомат, который является именно классом автомата, необходимым для распознавания контекстно-зависимого языка.