Анализ выражений

Задача анализа выражений - проверить описаны ли переменные, встречающиеся в выражениях, и соответствуют ли типы операндов друг другу и типу операции.

Эти задачи решаются следующим образом. Вводится таблица двуместных операций (таблица 4.2) и стек, в который в соответствии с разбором выражения E заносятся типы операндов и знак операции. После семантической проверки в стеке оставляется только тип результата операции. В результате разбора всего выражения в стеке остается тип этого выражения.

Для реализации анализа выражений введем следующие обозначения процедур и функций:

1) checkid - процедура, которая для лексемы LEX, являющейся идентификатором, проверяет по таблице идентификаторов TI, описан ли он, и, если описан, то помещает его тип в стек;

2) checkop – процедура, выводящая из стека типы операндов и знак операции, вызывающая процедуру gettype (op, t 1, t 2, t), проверяющая соответствие типов и записывающая в стек тип результата операции;

3) gettype (ор, t 1, t 2, t) – процедура, которая по таблице операций TOP для операции ор выдает тип t результата и типы t 1, t 2 операндов;

4) checknot – процедура проверки типа для одноместной операции «Ø».

Таблица 4.2 – Фрагмент таблицы двуместных операций TOP

Операция Тип 1 Тип 2 Тип результата
+ > … int int int int int bool

Перечисленные процедуры имеют следующий вид:

procedure checkid;

begin

k:= LEX [2];

if TI [ k ]. descrid = 0 then ERR;

inst (TI [ k ] .typid)

end;

procedure checkop;

begin

outst (top 2); outst (op); outst (top 1);

gettype (op, t 1, t 2, t);

if (top 1 <>t 1) or (top 2<> t 2) then ERR;

inst (t)

end;

procedure checknot;

begin

outst (t);

if t<> bool then ERR;

inst (t)

end;

Правила, описывающие выражения языка М, расширенные процедурами семантического анализа, принимают вид.

Е ® Е 1 {(> | < | =) < instl> E 1 <checkop >}

EТ {(+ | - | Ú) < instl > T < checkop >}

T ® F {(* | / | Ù) < instl > F < checkop >}

F ® I <checkid>| N<inst (‘ int ’)> | L <inst (‘ bool ’) >| Ø F <checknot>| (E)

Пример Дано выражение a +5* b. Дерево разбора выражения и динамика содержимого стека представлены на рисунке 4.6.

 
 


int + int * int  

1)

int + int      

2)

int          

3)

Рисунок 4.6 – Анализ выражения a+5*b


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: