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

             {

             per2=(Float)(ResultHash.get(new Integer(word)));

      if((((((Vector)Tetrad.get(num)).elementAt(1))) == "/") && (per2.floatValue()==0)) {result="Ошибка деления на ноль. Переменная "+(((Vector)Tetrad.get(num)).elementAt(2)).toString()+" равна нулю";%><td align=center><%=result%></td><%break;}

             }

      else {result="Переменная "+(((Vector)Tetrad.get(num)).elementAt(2)).toString()+" не инициализированна";%><td align=center><%=result%></td><%break;}

При обнаружении такой ошибки, выполнение текущего блока прекращается.

На этапе работы синтаксического анализатора происходит пресечение всех остальных семантических ошибок.

Для определения не уникальности имени блока его имя сравнивается с именами уже обработанных блоков:

if(NameBlock.contains(currentLexem.textOfWord.toString())==true) { SemanticError.removeElementAt(0);SemanticError.add("Семантическая ошибка: одинаковые имена блоков!");return false;}

Для пресечения присвоения значения переменной самой себе, при входе в каждый оператор присваивания происходит запоминание пройденных идентификаторов. Если в одном операторе идентификатор встречается не в выражении более одного раза, то это ошибка:

if(SemIdent.contains(currentLexem.textOfWord.toString())==true){ SemanticError.removeElementAt(0);SemanticError.add("Семантическая ошибка: присвоение значения переменной самой себе!");return false;}else{SemIdent.add(currentLexem.textOfWord.toString());}

Остальные пять семантических проверок (недопустимость передачи значений с выхода на вход одного и того же блока; недопустимость передачи значений на входы блоков типа vars; недопустимость передачи значений не идентифицированному блоку или передачи значений из не идентифицированного блока; соответствие имён блоков и имён идентификаторов, заданных в блоках связей, таблицам идентификаторов; недопустимость многократной передачи данных на одни и те же входы одних и тех же блоков) осуществляются в конце проверке синтаксиса, перед выходом из синтаксического анализатора:

int cnt;

for(cnt=0;cnt<Svyaz.size();cnt++)

{String NameBlockOut = ((Vector)Svyaz.get(cnt)).elementAt(0).toString();

String NameBlockIn = ((Vector)Svyaz.get(cnt)).elementAt(2).toString();

if((NameBlock.contains(NameBlockOut)==false) || (NameBlock.contains(NameBlockIn)==false))

{ SemanticError.add("Семантическая ошибка: в связях присутствует имя не идентифицированного блока!");

return false;}

if(NameBlockVARS.contains(NameBlockIn)==true)

{SemanticError.add("Семантическая ошибка: в связях имеется попытка изменить значение переменных блока vars c именем "+NameBlockIn+"!");

return false;}

if((NameBlockOut.equals(NameBlockIn))==true)

{SemanticError.add("Семантическая ошибка: связь осуществляет передачу значения внутри блока!");

return false;}

String NameIdentOut = ((Vector)Svyaz.get(cnt)).elementAt(1).toString();

String NameIdentIn = ((Vector)Svyaz.get(cnt)).elementAt(3).toString();

if(((Hashtable)(identTableBlock.get(NameBlockOut))).get(NameIdentOut)==null)

{SemanticError.add("Семантическая ошибка: в связях имя выхода "+NameIdentOut+" и имя блока "+NameBlockOut+" не соответствуют!");

return false;}

if(((Hashtable)(identTableBlock.get(NameBlockIn))).get(NameIdentIn)==null)

{SemanticError.add("Семантическая ошибка: в связях имя входа "+NameIdentIn+" и имя блока "+NameBlockIn+" не соответствуют!");

return false;}}

for(cnt=0;cnt< Svyaz.size()-1;cnt++)

{String NameBlockIn = ((Vector)Svyaz.get(cnt)).elementAt(2).toString();

String NameIdentIn = ((Vector)Svyaz.get(cnt)).elementAt(3).toString();

for(int cnt2=cnt+1;cnt2< Svyaz.size();cnt2++)

{String NameBlockIn2 = ((Vector)Svyaz.get(cnt2)).elementAt(2).toString();

String NameIdentIn2 = ((Vector)Svyaz.get(cnt2)).elementAt(3).toString();

if(((NameBlockIn.equals(NameBlockIn2))==true) && ((NameIdentIn.equals(NameIdentIn2))==true))