По результатам обработки блоков связей и заголовков происходит формирование единой таблицы связей Svyaz. Структуры используемые для создания таблицы связей приведены ниже:
//блоки связей
//имя блока выхода
final Vector OutBlock= new Vector();
//имя переменной выхода
final Vector OutIdent= new Vector();
//временная строка связей, состоящая из имен блоков входа и выхода, имен переменных входа и выхода
final Vector TetSvyaz= new Vector();
//таблица связей
final Vector Svyaz= new Vector();
Если в программе используется конструкция для передачи одного значения выхода нескольким входам, то для каждого входа создается своя строка в таблице связей.
Имя блока с выходом и имя выходной переменной заносятся в OutBlock и OutIdent соответственно. Они могут использоваться многократно в случае описанном выше.
Создание очередной строки для таблицы связей осуществляется так:
//занесение имени блока с выходом, имени выхода и имени блока с входом
TetSvyaz.add(OutBlock.get(OutBlock.size()-1));TetSvyaz.add(OutIdent.get(OutIdent.size()-1));TetSvyaz.add(currentLexem.textOfWord.toString());
//занесение имени входа
TetSvyaz.add(currentLexem.textOfWord.toString());
//пополнение таблицы связей очередной строкой и очистка TetSvyaz
Svyaz.add(TetSvyaz.clone());TetSvyaz.removeAllElements();
Код вывода таблицы связей приведён ниже:
<br>
<div align=center>Таблица связей</div>
<table align=center border=2>
<tr><td align=center>Блок с выходом</td><td align=center>Переменная-выход</td><td align=center>Блок с входом</td><td align=center>Переменная-вход</td><tr>
<% for(num=0; num<Svyaz.size(); num++)
{%><tr><td align=center><%=((Vector)Svyaz.get(num)).elementAt(0)%></td><td align=center><%=((Vector)Svyaz.get(num)).elementAt(1)%></td><td align=center><%=((Vector)Svyaz.get(num)).elementAt(2)%></td><td align=center><%=((Vector)Svyaz.get(num)).elementAt(3)%></td></tr><%}%>
</table>
<br>
Таблица связей
Блок с выходом |
Переменная-выход |
Блок с входом |
Переменная-вход |
1vars1 |
a1 |
1do1 |
x1 |
1vars1 |
a2 |
3do3 |
x42 |
1vars1 |
b |
1do1 |
x2 |
1vars1 |
b |
3do3 |
x43 |
1do1 |
out1 |
3do3 |
x41 |
1do1 |
out1 |
2do2 |
v3v2 |
2vars2 |
c |
1do1 |
x3 |
2vars2 |
d |
1do1 |
x4 |
2vars2 |
c |
3do3 |
x44 |
2vars2 |
d |
3do3 |
x45 |
3do3 |
out41 |
2do2 |
v3v1 |
2do2 |
out1 |
4do4 |
x51 |
2do2 |
out1 |
4do4 |
x52 |
Семантические проверки осуществляются как на этапе работы синтаксического анализатора, так и на этапе работы интерпретатора. Семантический анализатор использует следующие структуры:
//семантические проверки
//имена блоков VARS
final Vector NameBlockVARS= new Vector();
//имена блоков DO
final Vector NameBlockDO= new Vector();
//для хранения имени последнего идентификатора в операторе присваивания(используется для проверке недопустимости присваивания переменной самой себе)
final Vector LastIdent= new Vector();
//для хранения идентификаторов из оператора присваивания (используется для проверке недопустимости присваивания переменной самой себе)
final Vector SemIdent = new Vector();
//сюда заносится сообщение об ошибке
final Vector SemanticError = new Vector();
На этапе работы интерпретатора пресекается использование значения переменной до первого присваивания ей значения:
if(ResultHash.get(new Integer(word))!=null)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.