Пред.Страница След.Страница  Раздел Содержание


7.3. Символы действия и транслирующая грамматика

Для того, чтобы построить транслирующую грамматику, необходимо определить символы действия и включить их в правила грамматики, используемой на этапе синтаксического анализа. Основным назначением символов действия являются формирование выходных результатов преобразователя и выполнение семантической обработки входной программы, которая должна совмещаться с последовательным процессом работы преобразователя. В нашем случае формирование результата заключается в построении таблицы АtomТable и занесении в неё атомов.

Обработка предусматривает извлечение атрибутов входных символов, выделение памяти, заполнение и контроль таблицы TVR, а также управление работой магазина преобразователя.

В тексте программы на входном языке вначале размещается описание переменных, которое начинается ключевым словом, определяющим их тип. Для сохранения типа и подготовки передачи его переменным описания определим символ действия setTYPE{STP}.

Все переменные, перечисленные в описании, необходимо занести в таблицу VariableTable. Указатель на символьное представление каждой переменной в таблице LexTab синтаксический анализатор получает из токена. Для того, чтобы извлечь указатель и записать его в таблицу VariableTable, определим символ действия makeVariable{MVR}.

В операторах программы могут быть использованы только переменные, определенные в описании. Чтобы убедиться в том, что переменная была описана, необходимо проверить записана ли переменная в таблицу TVR. Примем, что такую проверку выполняет символ действия checkVariable{CVR}.

Для построения атомов операций разных типов естественно использовать различные символы действия. Таким образом, для рассматриваемого языка нам потребуются два символа действия, задающие построение двуместных операций конъюнкции makeAND {MAD} и дизъюнкции makeOR {MOR}, а также два символа действия для построения атомов одноместных операций отрицания makeNOT{MNT} и присваивания makeASS {MAS}.

Символ действия {MAS}., кроме построения соответствующего атома, должен устанавливать свойство таблицы TVR, говорящее о том, что переменная левой части получила значение.

Для обработки логических значений, обозначаемых ключевыми словами, которые должны сохраняться в таблице ValueTable, введем символ действия makeValue{MVL}.

Забегая вперед, определим еще один символ действия, который понадобится нам при построении атрибутной грамматики passAtribute{PAT}. Этот символ будет использоваться в заключительных правилах грамматики. Он должен осуществлять присваивание значения атрибута, расположенного непосредственно под вершиной магазина, атрибуту, находящемуся на вершине.

 

Таблица 7.1. Символы действия грамматики

 

Номер

Символ действия

1

makeASS {MAS}

2

makeAND {MAD}

3

makeOR {MOR}

4

makeNOT{MNT}

5

makeVariable{MVR}

6

setTYPE{STP}

7

checkVariable{CVR}

8

passAtribute{PAT}

9

makeValue{MVL}

10

RemoveATribute{RAT}

 

Вторая фаза построение транслирующей грамматики, заключается во включении символов действия в правила входной грамматики. Для выбора позиций для включения символов действия могут быть использованы следующие правила:

·        Символ действия, выполняющий обработку типа {STP} следует располагать непосредственно после ключевого слова, обозначающего тип.

·        Символы действия, {MVR} выполняющие извлечение указателей из токенов и занесение в таблицу TVR, следует размещать в описаниях непосредственно после идентификаторов переменных.

·        Атомы, соответствующие операциям конъюнкции, дизъюнкции и отрицания, могут быть построены только после того, как в выходной цепочке появятся операнды и знак операции. Следовательно, символы действия {MAD}, {MOR}  и {MNT}должны располагаться в правилах, добавляющих при выводе знак операции и единственный или второй операнд.

·        Атом, соответствующий операции присваивания, может быть построен только после того, как в выводимой цепочке появится переменная левой части со знаком присваивания и будет построено выражение, определяющее значение правой части. Следовательно, символ действия {MAS} нужно расположить в конце правила, определяющего оператор присваивания.

·        Символ {CVR},проверяющий вхождение переменной в таблицу TVR, должен быть размещен в конце правил с идентификатором в правой части.

·        Символ действия {MVL} следует располагать после ключевых слов, обозначающих логические значения.

После включения символов действия, схема искомой Т‑грамматики может быть представлена в следующем виде:

 

<Программа> ::= {<Описание_перемен>
                <Последовательность_операторов>}

<Описание_ перемен> ::= "bool"{STP}<Про_описание1>

<Про_описание1> ::=":""Идентификатор"{MVR}
                               <Про_описание2>

<Про_описание2> ::= ",""Идентификатор"{MVR}
                        <Про_описание2>

<Про_описание2> ::= ;

<Последовательность_операторов> ::=
            <Оператор><Про_последовательность>

<Про_последовательность> ::=
            <Оператор><Про_последовательность>

<Про_последовательность> ::= $

<Оператор> ::= "Идентификатор"{CVR}<Про_оператор>

<Про_оператор> ::= "="<Выражение>{MAS};

<Выражение> ::= <Терм><Про_выражение>

<Про_выражение> ::= "|" <Терм>{MOR}<Про_выражение>

<Про_выражение> ::= $

<Терм> ::= <Фактор><Про_терм>

<Про_терм> ::= "&" <Фактор>{MAD}<Про_терм>

<Про_терм> ::= $

<Фактор> ::= <Факт>

<Фактор> ::=  "~"<Факт>{MNT}

<Факт>::="Идентификатор"{CVR}

<Факт>::= "("<Выражение>")"

<Факт>::= "false"{MVL}

<Факт>::= "true"{MVL}

 

Чтобы сократить размер описания построенной грамматики и приблизить его к внутреннему представлению в процедурах преобразователя, построим "числовое" описание грамматики. Такое описание можно получить, заменяя нетерминальные символы и символы действия их номерами, которые приведены в таблицах 7.1 и 7.2.

 

Таблица 7.2. Нетерминальные символы грамматики

 

Номер

Нетерминальный символ

1

<Программа>

2

<Описание_ переменых>

3

<Последовательность_операторов>

4

<Продолжение1>

5

<Про_описание>

6

<Продолжение2>

7

<Оператор>

8

<Про_последовательность>

9

<Про_оператор>

10

<Выражение>

11

<Продолжение3>

12

<Терм>

13

<Про_выражение>

14

<Фактор>

15

<Про_терм>

16

<Факт>

17

<Продолжение4>

 

После замены нетерминальных символов и символов действия их номерами, получаем схему грамматики в компактном виде:

 

<1> ::= "{"<2><3>"}"

<2> ::= "bool"{6}<4>

<4> ::=":""Идентификатор"{5} <5>

<5> ::= ",""Идентификатор"{5}<5>

<5> ::= ";"

<3> ::= <6><7>

<7> ::= <6><7>

<7> ::= $

<6> ::= "Идентификатор"{7}<8>

<8> ::= "="<9>"{1};"

<9> ::= <10><11>

<11> ::= "|" <10>{3}<11>

<11> ::= $

<10> ::= <12><13>

<13> ::= "&" <12>{2}<13>

<13> ::= $

<12> ::= <14>

<12> ::= "~"<14>{4}

<14>::="Идентификатор"{7}

<14>::= "("<9>")"

<14>::= "false"{9}

<14>::= "true"{9}

 


Пред.Страница След.Страница  Раздел Содержание