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

//счетчик числа условных операторов

int ifCnt=0;

При вхождении в очередной условный оператор происходит инкрементирование счётчика и занесение значения в стэк StackIf. При формировании меток текущего условного оператора происходит использовании значения, находящегося на верхушке стэка. При завершении обработки текущего условия происходит удаление значения из стэка.

Занесение значения в стэк и добавление к ПФЗ бинарного оператора условного перехода по лжи:

StackIf .push (new Integer(++ifCnt));StrPFR.add("Label0_"+StackIf.peek());StrPFR.add("GF");

            Добавление в ПФЗ унарного оператора условного перехода по истине:

StrPFR.add("Label1_"+StackIf.peek());StrPFR.add("GO");

Так как условный оператор может быть полным и сокращённым, то в строках грамматики определяющих наличие перехода по лжи условия, определены совершенно разные действия. Если оператор условия имеет полную форму, то к ПФЗ добавляется метка перехода по лжи, а после занесения ПФЗ совокупности операторов выполняемых по else и добавление метки завершения оператора условия:

StrPFR.add("Label0_"+StackIf.peek()+":");

StrPFR.add("Label1_"+StackIf.pop()+":");

Если оператор условия имеет сокращённую форму, то из ПФЗ удаляется два последних значения и вносится лишь метка завершения оператора условия:

StrPFR.remove(StrPFR.size()-1);StrPFR.remove(StrPFR.size()-1);StrPFR.add("Label0_"+StackIf.pop()+":");

Занесение текущего вектора ПФЗ в таблицу ПФЗ всей программы на заданном варианте языка осуществляется с помощью следующих функций:

PFR.put(NameBlock.get(NameBlock.size()-1),StrPFR.clone());StrPFR.removeAllElements();

В результате работы синтаксического анализатора на экран выводятся постфиксная запись всей программы, разбитая на части в соответствии с числом блоков do и vars. Код вывода приведён ниже:

<br>

<div align=center>Постфиксная запись</div>

<table align=center border=2>

<tr><td align=center>Имя блока</td><td align=center>Постфиксная запись</td><tr>

<% for(int Cnt=0; Cnt<NameBlock.size(); Cnt++)

{%><tr><td align=center><%=(key=NameBlock.get(Cnt))%></td> <td align=center><%=(((Vector)(PFR.get(key))).toString())%></td></tr><%}%>

</table>

<br>


Результат преобразования последовательности лексем в постфиксную запись

Постфиксная запись

Имя блока

Постфиксная запись

1vars1

[a1, a2, 2, let, let, b, 2, let]

1do1

[in1, x1, x2, +, let, in2, x3, x4, +, let, in1, in2, >, Label0_1, GF, out1, in1, in2, -, let, Label0_1:, in1, in2, <, Label0_2, GF, out1, in2, in1, -, let, Label1_2, GO, Label0_2:, out1, 0, let, Label1_2:]

2do2

[in1, v3v1, v3v2, +, let, in2, v3v1, v3v2, -, let, in1, in2, >, Label0_3, GF, stek1, in1, let, Label1_3, GO, Label0_3:, in2, in1, >=, Label0_4, GF, stek1, in2, let, Label0_4:, Label1_3:, v3v1, v3v2, *, stek1, >, Label0_5, GF, stek1, v3v1, v3v2, *, let, Label0_5:, v3v2, v3v1, /, stek1, >, Label0_6, GF, stek1, v3v2, v3v1, /, let, Label0_6:, out1, stek1, let]

3do3

[x41, 4, >=, Label0_7, GF, out41, x42, x43, x44, x45, +, +, +, 4, /, let, Label1_7, GO, Label0_7:, x41, 0, ==, Label0_8, GF, out41, x42, x43, x44, x45, *, *, *, let, Label1_8, GO, Label0_8:, out41, x42, x43, x44, x45, +, +, +, x41, /, let, Label1_8:, Label1_7:]

4do4

[x51, 0, ==, Label0_9, GF, out1, 0, let, Label1_9, GO, Label0_9:, x51, 0, >, Label0_10, GF, out1, 1, let, Label1_10, GO, Label0_10:, out1, 0.5, let, Label1_10:, Label1_9:, new, x52, 8, 2, x52, *, 1, +, /, *, let, new, 0, ==, Label0_11, GF, out2, 0, let, x51, 5, ==, Label0_12, GF, out3, 5, let, Label0_12:, Label1_11, GO, Label0_11:, new, 0, <, Label0_13, GF, out2, 0.5, let, Label1_13, GO, Label0_13:, out2, 1, let, Label1_13:, Label1_11:]

2vars2

[c, 3, let, d, 3, let]