ВУЗ:
Составители:
<программа> → <имя программы> var <раздел
переменных> begin <раздел операторов> end.
<имя программы> → ид
<раздел переменных> → <список переменных>:<тип>
<список переменных> → ид {, ид}
<тип> → integer
<оператор> → <присваивание> / <ввод> /<вывод> /<цикл>
<присваивание> → ид := <арифметическое выражение>
<арифметическое выражение> → <слагаемое> {+<слагаемое>}{–<слагаемое>}
<слагаемое> → <значение> {*<значение>} {div <значение>}
<ввод> → read (<список переменных>)
<вывод> → write (<список переменных>)
<цикл> → for <выражение цикла> to <тело цикла>
<выражение цикла> → ид :=<арифметическое выражение>
do <арифметическое выражение>
<тело цикла> → <оператор>/ begin <раздел операторов> end
Приведем примеры алгоритмов синтаксического анализа методом рекурсивного спуска для некото-
рых предложений исходной программы с использованием приведенной грамматики.
Имеем предложение исходной программы: read (a).
Тогда процедура разбора этого предложения может иметь вид:
procedure <ввод>;
begin
BP := false;
if t = read then
begin
перейти к следующей лексеме;
if t = ( then begin
перейти к следующей лексеме;
if <список переменных> закончилась успешно
then
if t = ) then begin
BP := true;
перейти к следующей лексеме;
end; {if )}
end; {if (}
end; {if read}
if BP = true then успешное завершение
else неудачное завершение;
end;
В приведенной процедуре BP – вспомогательная переменная, а t – переменная, определяющая тип
лексемы. Процедура, соответствующая нетерминальному символу <ввод>, вызывает процедуру <список
переменных>:
procedure <список переменных>;
begin
BP := false;
if t=ид then
begin
Страницы
- « первая
- ‹ предыдущая
- …
- 8
- 9
- 10
- 11
- 12
- …
- следующая ›
- последняя »