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

    else res = (Object)(new String(""));

    ind = ((lexem)(((Hashtable)(HTidTotal.get(block_name))).get(((Vector)Pentad.get(i)).elementAt(4).toString()))).wordIndex;

    if (ind >= VectValues.size()) VectValues.setSize(ind+1);

    VectValues.set(ind, res);

    %><td align=center><%=res%></td><%

}

else if (((Vector)Pentad.get(i)).elementAt(1).toString().equals("Jmp"))

{

    String label1 = ((Vector)Pentad.get(i)).elementAt(2).toString();

    for (i++; i<Pentad.size(); i++)

    {

        String label2 = ((Vector)Pentad.get(i)).elementAt(0).toString();

        if (label2.startsWith(label1))

        {  

            %><td align=center><%="Переход на метку "+label1+"."%></td><%

            i--;

            break;

        }   

    }

    if (i == Pentad.size()) {%><td align=center><%="Метка "+label1+" не найдена."%></td><%}

}

else if (((Vector)Pentad.get(i)).elementAt(1).toString().equals("JmpF"))

{

    String label1 = ((Vector)Pentad.get(i)).elementAt(2).toString();

    if (((Integer)(VectValues.get(((lexem)(((Hashtable)(HTidTotal.get(block_name))).get(((Vector)Pentad.get(i)).elementAt(3).toString()))).wordIndex))).intValue() == 0)

    {

        for (i++; i<Pentad.size(); i++)

        {

            String label2 = ((Vector)Pentad.get(i)).elementAt(0).toString();

            if (label2.startsWith(label1))

            {  

                %><td align=center><%="Переход на метку "+label1+" (условие ложно)."%></td><%

                i--;

                break;

            }   

        }

        if (i == Pentad.size()) {%><td align=center><%="Метка "+label1+" не найдена."%></td><%}   

    }

    else {%><td align=center><%="Переход к следующему выражению (условие истинно)."%></td><%}

}

%>

</tr><%}%>

</table></p>

<%

for (i=0; i<VectJoinTotal.size(); i++)

{

    String out_block = ((Vector)VectJoinTotal.get(i)).elementAt(0).toString();

    String out_id = ((Vector)VectJoinTotal.get(i)).elementAt(1).toString();

    if ((block_name.equals(out_block)))

    {

        ind = ((lexem)(((Hashtable)(HTidTotal.get(out_block))).get(out_id))).wordIndex;

        if (ind<VectValues.size() && VectValues.get(ind) != null)

        {

            String in_block = ((Vector)VectJoinTotal.get(i)).elementAt(2).toString();

            String in_id = ((Vector)VectJoinTotal.get(i)).elementAt(3).toString();  

            ind2 = ((lexem)(((Hashtable)(HTidTotal.get(in_block))).get(in_id))).wordIndex;

            val = new Float((VectValues.get(ind).toString()));

            if (ind2 >= VectValues.size()) VectValues.setSize(ind2+1);

            VectValues.set(ind2, val);

            VectJoinTotal.remove(i);

            i--;

        }   

    }

}

TmpNames.remove(ii);

}%>

<br>

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

11.3. Результат выполнения последовательности пентад.

Обновлённый программный код тестовой программы:

Первый блок переменных

{11:vars;

    let a1 5;

    let b a1;

    let b1 (a1+10.3)*2;

    let c1 b/a1;

}   

Второй блок переменных

{12:vars;

    let a2 34.24;

    let b2 5+a2;

    let c2 b2/4;

Треттий блок переменных

{13:vars;

    let x 0;

    let y 0;

}

Первый блок вычислений

{21:do;    

    let x aa1*aa2-4*b1*b2;

    ? x>0 && b2 != a1 let x x-c1;

    or ? x<0 let x x-x*2;

    or let x x*2;

}

Второй блок вычислений

{22:do;

    let y cc1+cc2;

    ? y>=0 || cc1<(cc2+bb1) let y y+x;

    or

    {

        ? y<0 {let y x*2;}