Разработка компиляторов. Ишакова Е.Н. - 22 стр.

UptoLike

Составители: 

22
При описании синтаксиса языков программирования часто встречаются
правила, которые задают последовательность однотипных конструкций, отде-
ленных друг от друга каким-либо разделителем. Общий вид таких правил:
La | a,L или в сокращенной форме La{,a}.
Формально здесь не выполняются условия метода рекурсивного спуска,
т.к. две альтернативы начинаются одинаковыми терминальными символами. Но
если принять соглашения, что в подобных ситуациях выбирается самая длинная
подцепочка, выводимая из нетерминала L, то разбор становится детерминиро-
ванным, и метод рекурсивного спуска будет применим к данному правилу
грамматики. Соответствующая правилу процедура будет иметь вид:
procedure L;
begin
if CH<>’a then Err else gc;
while CH=’,’ do
begin
gc;
if CH<>’a then Err
end
end;
Пример 2.10. Построим синтаксический анализатор методом рекурсив-
ного спуска для модельного языка М.
Входфайл лексем в числовом представлении.
Выходзаключение о синтаксической правильности программы или со-
общение об имеющихся ошибках.
Введем обозначения:
1) LEXпеременная, содержащая текущую лексему, считанную из файла
лексем;
2) glпроцедура считывания очередной лексемы из файла лексем в пе-
ременную LEX;
2) EQ(S) – логическая функция, проверяющая, является ли текущая лек-
сема LEX лексемой для S;
3) ID логическая функция, проверяющая, является ли LEX
идентификатором;
4)
NUM - логическая функция, проверяющая, является ли LEX числом.
Процедуры, проверяющие выполнение правил, описывающих язык М и
составляющие синтаксический анализатор, будут иметь следующий вид:
1) для правила Р program D1 В.
procedure Р;
begin
if EQ(`program`) then gl else ERR;
D1;
     При описании синтаксиса языков программирования часто встречаются
правила, которые задают последовательность однотипных конструкций, отде-
ленных друг от друга каким-либо разделителем. Общий вид таких правил:
           L→a | a,L или в сокращенной форме L→a{,a}.
       Формально здесь не выполняются условия метода рекурсивного спуска,
т.к. две альтернативы начинаются одинаковыми терминальными символами. Но
если принять соглашения, что в подобных ситуациях выбирается самая длинная
подцепочка, выводимая из нетерминала L, то разбор становится детерминиро-
ванным, и метод рекурсивного спуска будет применим к данному правилу
грамматики. Соответствующая правилу процедура будет иметь вид:
     procedure L;
     begin
        if CH<>’a’ then Err else gc;
        while CH=’,’ do
            begin
               gc;
               if CH<>’a’ then Err
            end
     end;
      Пример 2.10. Построим синтаксический анализатор методом рекурсив-
ного спуска для модельного языка М.
      Вход – файл лексем в числовом представлении.
      Выход – заключение о синтаксической правильности программы или со-
общение об имеющихся ошибках.
      Введем обозначения:
      1) LEX – переменная, содержащая текущую лексему, считанную из файла
лексем;
      2) gl – процедура считывания очередной лексемы из файла лексем в пе-
ременную LEX;
      2) EQ(S) – логическая функция, проверяющая, является ли текущая лек-
сема LEX лексемой для S;
      3) ID – логическая функция, проверяющая, является ли LEX
идентификатором;
      4) NUM - логическая функция, проверяющая, является ли LEX числом.
      Процедуры, проверяющие выполнение правил, описывающих язык М и
составляющие синтаксический анализатор, будут иметь следующий вид:
     1) для правила Р→ program D1 В.
     procedure Р;
     begin
         if EQ(`program`) then gl else ERR;
         D1;

                                                                        22