Разработка языка, предназначенного для программирования потоковых вычислений, страница 11


Обработка блоков связей и заголовков

По результатам обработки блоков связей и заголовков происходит формирование единой таблицы связей 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)