Пред.Страница След.Страница Раздел Содержание
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}
Пред.Страница След.Страница Раздел Содержание