{SemanticError.add("Семантическая ошибка: в связях определена передача разных значений одним переменным(конфликт)!");
return false;}}}
При обнаружении ошибок в проверяемой программе на этапе работы синтаксического анализатора в вектор SemanticError заносится сообщение об ошибке и происходит возвращение значения false из синтаксического анализатора. Поэтому результатом проверки любой программы с ошибками будет только вывод сообщения о неправильности и сообщения о типе ошибке. Вывод информации о построенных за время работы синтаксического анализатора структур не производится.
Сначала приведу пример лексической ошибки:
Допустим, в блоке 1vars1 вместо переменной а1 задали переменную 1а1:
{1vars1:vars;
let 1a1 let a2 2;
let b 2;}
Результат будет таким:
Проверяемый текст неверен. [Лексическая или синтаксическая ошибка!]
Теперь приведу пример синтаксической ошибки:
Допустим, в блоке 1vars1 был опущен оператор let:
{1vars1:vars;
let a1 let a2 2;
b 2;}
Результат будет таким:
Проверяемый текст неверен. [Лексическая или синтаксическая ошибка!]
Ну, а теперь примеры семантических ошибок:
1. Допустим, вместо имени блока 2vars2 оставили имя 1vars1:
{1vars1:vars;
let a1 let a2 2;
letb 2;}…
{1vars1:vars;
let c 3;
let d 3;}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: одинаковые имена блоков!]
2. Допустим, вместо переменной a2 написали a1:
{1vars1:vars;
let a1 let a1 2;
letb 2;}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: присвоение значения переменной самой себе!]
3. Допустим, имя блока выхода и имя блока входа совпадают(1do1):
{1join1:join;
1vars1 _o_ a1 -> 1do1 _i_ x1;
1vars1 _o_ a2 -> 3do3 _i_ x42;
1vars1 _o_ b -> 1do1 _i_ x2, 3do3 _i_ x43;
1do1 _o_ out1 -> 1do1 _i_ x41, 2do2 _i_ v3v2;
}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: связь осуществляет передачу значения внутри блока!]
4. Допустим, имя блока выхода и имя блока входа совпадают(1do1):
{1join1:join;
1vars1 _o_ a1 -> 1vars1_i_ a1;
1vars1 _o_ a2 -> 3do3 _i_ x42;
1vars1 _o_ b -> 1do1 _i_ x2, 3do3 _i_ x43;
1do1 _o_ out1 -> 3do3 _i_ x41, 2do2 _i_ v3v2;
}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: в связях имеется попытка изменить значение переменных блока vars c именем 1vars1!]
5. Допустим, в качестве имени блока выхода задано asd (такого блока нет в программе):
{1join1:join;
asd_o_ a1 -> 1do1 _i_ x1;
1vars1 _o_ a2 -> 3do3 _i_ x42;
1vars1 _o_ b -> 1do1 _i_ x2, 3do3 _i_ x43;
1do1 _o_ out1 -> 3do3 _i_ x41, 2do2 _i_ v3v2;
}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: в связях присутствует имя не идентифицированного блока!]
6. Допустим, в качестве имени блока выхода задано 1vars1, а в качестве имени выхода q (такой переменной нет в блоке 1vars1):
{1join1:join;
1vars1 _o_ q -> 1do1 _i_ x1;
1vars1 _o_ a2 -> 3do3 _i_ x42;
1vars1 _o_ b -> 1do1 _i_ x2, 3do3 _i_ x43;
1do1 _o_ out1 -> 3do3 _i_ x41, 2do2 _i_ v3v2;
}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: в связях имя выхода q и имя блока 1vars1 не соответствуют!]
7. Допустим, на вход x1 блока 1do1 значения передаются дважды:
{1join1:join;
1vars1 _o_ a1 -> 1do1 _i_ x1;
1vars1 _o_ a2 -> 3do3 _i_ x42;
1vars1 _o_ b -> 1do1 _i_ x1, 3do3 _i_ x43;
1do1 _o_ out1 -> 3do3 _i_ x41, 2do2 _i_ v3v2;
}
Результат будет таким:
Проверяемый текст неверен. [Семантическая ошибка: в связях определена передача разных значений одним переменным(конфликт)!]
Приводить примеры ошибок можно до бесконечности. Считаю, что в этом нет необходимости, так как я привёл для каждого типа ошибок по одному примеру. Возможно, мною не учтены какие-либо другие типы ошибок, но пока я их не обнаружил.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.