Вывод синтаксических ошибок |
Если анализатор обнаруживает синтаксическую ошибку, он генерирует исключение типа InterpExc, задающее значение перечислимого типа, соответствующее типу найденной ошибки (другие части интерпретатора Mini С++ также используют класс InterpExc для сообщений об ошибках). Обработчик исключения InterpExc включен в функцию main () — часть основного файла интерпретатора minicpp.cpp, который будет описан позже. Этот обработчик для сообщения об ошибке вызывает функцию sntx_err (), приведенную далее. // Отображает сообщение об ошибке, void sntx_err (error_jnsg error) { char *p, *temp; int linecount = 0; static char *e[]= { "Syntax error", "No expression present", "Not a variable", "Duplicate variable name", "Duplicate function name". "Semicolon expected", "Unbalanced braces", "Function undefined", "Type specifier expected", "Return without call", "Parentheses expected", "While expected", "Closing quote expected", "Division by zero", " expected (control statements must use blocks)", "Colon expected" }; // Выводит ошибку и номер строки, cout « "\n" « е[error); p = p_buf; while(p != prog) { // находит номер строки с ошибкой Р++; if(*р == '\г') { linecount++; } } cout « " in line " « linecount « endl; temp = p; while(р > p_buf && *р != '\n') р~; // Отображает ошибочную строку, while(р <= temp) cout « *р++; cout « endl; } Обратите внимание, функция sntx_err () отображает строку, описывающую ошибку и номер строки кода, в которой обнаружена ошибка (он может указывать на строку, следующую за той, в которой ошибка действительно име-' ла место). Функция также выводит на экран содержимое строки с ошибкой.
|