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