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

UptoLike

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

28
Пример 2.12. Дано выражение a+5*b. Дерево разбора выражения и дина-
мика содержимого стека представлены на рисунке 2.8.
Рисунок 2.8 – Анализ выражения a+5*b
Проверка правильности операторов
Задачи проверки правильности операторов:
1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
2) установить соответствие типов в операторе присваивания слева и спра-
ва от символа «:=»;
3) определить, является ли выражение Е в операторах условия и цикла
булевым.
Данные задачи решаются путем включения в правило S ранее рассмот-
ренной процедуры checkid, а также новых процедур eqtype и eqbool, имеющих
следующий вид:
procedure eqtype;
begin
outst(t2); outst(t1);
if t1<>t2 then ERR
end;
procedure eqbool;
begin
outst(t);
if t<>bool then ERR
end;
Правило S с учетом процедур СеА примет вид:
S I <checkid> := E <eqtype> | if E <eqbool> then S else S
while E <egbool> do S | write (E) | read (I <checkid> )
int
+
int
*
int
int
+
int
int
1)
E
E1
T + T
F
I
C
F * F
N
R
5
I
C
b
a
2)
3)
      Пример 2.12. Дано выражение a+5*b. Дерево разбора выражения и дина-
мика содержимого стека представлены на рисунке 2.8.
                 E

                E1

          T      +           T             1)   int +    int *   int


          F          F           *   F
                                           2)   int +    int

          I          N               I

                                           3)   int
          C          R               C

          a          5               b

                         Рисунок 2.8 – Анализ выражения a+5*b
                         Проверка правильности операторов
      Задачи проверки правильности операторов:
      1) выяснить, все ли переменные, встречающиеся в операторах, описаны;
      2) установить соответствие типов в операторе присваивания слева и спра-
ва от символа «:=»;
      3) определить, является ли выражение Е в операторах условия и цикла
булевым.
      Данные задачи решаются путем включения в правило S ранее рассмот-
ренной процедуры checkid, а также новых процедур eqtype и eqbool, имеющих
следующий вид:
      procedure eqtype;
      begin
          outst(t2); outst(t1);
          if t1<>t2 then ERR
      end;
     procedure eqbool;
     begin
       outst(t);
       if t<>bool then ERR
     end;
     Правило S с учетом процедур СеА примет вид:
          S→ I  := E  | if E  then S else S
                 while E  do S | write (E) | read (I  )
                                                                           28