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

  1. Ошибка, если при установлении связи используется неопределённый блок.
  2. Ошибка, если при установлении связи в качестве входа и выхода используется один и тот же блок.
  3. Ошибка, если при установлении связи используется идентификатор, не соответствующий указанному входному или выходному блоку.
  4. Ошибка, если при установлении связей на один вход значение передаётся более чем с одного выхода.
  5. Ошибка, при использовании неопределенной переменной.
  6. Ошибка, при делении на 0.

Ошибки 1-4 обрабатываются следующим алгоритмом:

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

{

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

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

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

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

    if (VectNames.indexOf(out) == -1)

    {

        error.set("При установлении связей используется неопределенный блок1 - "+out+"!");

        return false;

    }

    if (VectNames.indexOf(in) == -1)

    {

        error.set("При установлении связей используется неопределенный блок2 - "+in+"!");

        return false;

    }

    if (out.equals(in))

    {

        error.set("При установлении связей в качестве выхода и входа используется один и тот же блок - "+out+"!");

        return false;

    }

    if (((Hashtable)(HTidTotal.get(out))).get(out_id) == null)

    {

        error.set("При установлении связей используется идентификатор "+out_id+", не соответствующий блоку "+out+"!");

        return false;   

    }

    if (((Hashtable)(HTidTotal.get(in))).get(in_id) == null)

    {

        error.set("При установлении связей используется идентификатор "+in_id+", не соответствующий блоку "+in+"!");

        return false;   

    }

    if (i != VectJoinTotal.size()-1)

    {

        for (int j=i+1; j<VectJoinTotal.size(); j++)

        {

            if (in.equals(((Vector)VectJoinTotal.get(j)).elementAt(2).toString()) && in_id.equals(((Vector)VectJoinTotal.get(j)).elementAt(3).toString()))

            {

                error.set("При установлении связей на вход "+in_id+" блока "+in+" значение передаётся более чем с одного выхода!");

                return false;                 

            }

        }

    }

}

Остальные ошибки обрабатываются при выполнении последовательности пентад.

11.3. Выполнение последовательности пентад.

Выполнение последовательности пентад представляет собой вычисление выражений программы, преобразованных в последовательность пентад. Для хранения вычисленных значений используется приведённый ниже объект:

final Vector VectValues = new Vector(); //вектор для хранения значений переменных

Для выполнения последовательности пентад применяется следующий алгоритм:

<br><div align=center><b><big>Выполнение последовательности пентад</big></b></div>

<%String block_name = new String(); int ii; int i; int block_ind = 0; Object err = ""; Object tmp; Object tmp2; int ind; int ind2; Float val; Float val2; Object res; Vector TmpNames = new Vector(VectNames); boolean found = true;%>

<% while (TmpNames.size() != 0)

{for (ii=0; ii<TmpNames.size(); ii++)

{

    for (int j=0; j<VectJoinTotal.size(); j++)

    {

        String in = ((Vector)VectJoinTotal.get(j)).elementAt(2).toString();

        if ((in.equals(TmpNames.get(ii))))

        {

            found=false;

            break;

        }

        else found=true;

    }

    if (found)

    {

        block_ind = VectNames.indexOf(TmpNames.get(ii));

        block_name = (String)(TmpNames.get(ii));

        break;

    }

}