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: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;}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.