ВУЗ:
Составители:
В соответствии с обычными правилами арифметики умножение и деление осуществляются до сло-
жения и вычитания. Можно сказать, что умножение и деление имеют более высокий уровень предшест-
вования, чем сложение и вычитание. При анализе первых двух операторов (+, *) выяснится, что опера-
тор + имеет более низкий уровень предшествования, чем оператор *. Часто это записывают следующим
образом
+ <• *
Аналогично для следующей пары операторов (* и –) оператор * имеет более высокий уровень
предшествования, чем оператор –. Мы можем записать это в виде
*•>–
Метод операторного предшествования использует подобные отношения между операторами для
управления процессом грамматического разбора. В частности, для рассмотренного арифметического
выражения мы получили следующие отношения предшествования:
А + В * С – В
<• •>
Отсюда следует, что подвыражение В * С должно быть вычислено до обработки любых других опе-
раторов рассматриваемого выражения. В терминах дерева грамматического разбора это означает, что
операция * расположена на более низком уровне узлов дерева, чем операция + или –. Таким образом,
рассматриваемый метод грамматического разбора должен распознать конструкцию В * С, интерпрети-
руя ее в терминах заданной грамматики, до анализа соседних термов предложения.
Предшествующее изложение иллюстрирует основную идею, на которой основан метод грамматиче-
ского разбора, построенный на отношения операторного предшествования. В рамках этого метода
предложение сканируется слева направо до тех пор, пока не будет найдено подвыражение, операторы
которого имеют более высокий уровень предшествования, чем соседние операторы. Далее это подвы-
ражение распознается в терминах правил вывода используемой грамматики. Этот процесс продолжает-
ся до тех пор, пока не достигнут корень дерева, что и будет означать окончание процесса грамматиче-
ского разбора. Далее мы рассмотрим приложение описанного подхода к нашему примеру программы
(рис. 1). Грамматика этого предложения имеет вид:
<программа>→<имя программы> vаr <раздел
переменных> begin <раздел операторов> end.
<имя программы>→ид
<раздел переменных>→<список переменных>:<тип>
<список переменных>→ид / <список переменных>, ид
<тип>→integer
<раздел операторов>→<оператор>/<раздел операторов>; <оператор>
<оператор>→<присваивание>/<ввод>/<вывод>/<цикл>
<присваивание>→ид := <арифметическое выражение>
<арифметическое выражение>→<слагаемое> /<арифметическое выражение>+/–<слагаемое>
<слагаемое> → <значение> >/<слагаемое> */div <значение>
<ввод>→read (<список переменных>)
<вывод>→write (<список переменных>)
<цикл>→for <выражение цикла> to <тело цикла>
<выражение цикла>→ид :=<арифметическое выражение> do <арифметическое выражение>
<тело цикла>→<оператор>/begin <раздел операторов>
end
Первым шагом при разработке процессора грамматического разбора, основанного на методе опера-
торного предшествования, должно быть установление отношений предшествования между операторами
Страницы
- « первая
- ‹ предыдущая
- …
- 14
- 15
- 16
- 17
- 18
- …
- следующая ›
- последняя »