Спонсоры сайта:

Наличие этой страницы в поиске?

Информеры ТИЦ и PR

  Yandex ТИЦ:  
   Google PR:  

Путешественникам, меломанам, бизнесменам, вебмастерам, новости.

Содержание | <<< | >>>

Проверка синтаксиса в рекурсивном нисходящем анализаторе





При разборе выражений синтаксическая ошибка — это просто ситуация, в которой входное выражение не соответствует строгим правилам анализатора. В большинстве случаев это происходит из-за ошибки человека — обычно из-за опечаток. Например, следующие выражения не являются правильными с точки зрения анализаторов, рассмотренных в данной главе:

10 ** 8
(10 - 5) * 9
/8

В первом из них встречаются два оператора подряд, во втором не сбалансированы скобки, а последнее начинается со знака деления. Ни одна из таких последовательностей не допускается рассмотренными анализаторами. Поскольку при наличии синтаксических ошибок анализатор может выдать неправильный результат, необходимо следить, чтобы подобных ошибок не было.

При изучении кода анализаторов вы, вероятно, заметили функцию serror(), вызываемую в определенных ситуациях. Эта функция сообщает об ошибках. В отличие от многих других типов анализаторов, рекурсивный спуск облегчает проверку синтаксиса, поскольку в большинстве случаев она происходит в функциях atom(), find_var() и eval_exp6(), где выполняется проверка правильной расстановки скобок. Единственная проблема, связанная с выявлением синтаксических ошибок, заключается в том, что при обнаружении ошибки разбор выражения не прекращается. Это может привести к выводу нескольких сообщений об ошибках.

Лучший способ реализации функции serror() — заставить ее выполнять нечто вроде восстановления правильного состояния анализатора. Например, все современные компиляторы поставляются вместе с парой вспомогательных функций setjmp() и longjmp(). Эти функции позволяют осуществить в программе передачу управления из одной функции в другую. Например, функция serror() могла бы выполнять длинный переход с помошью longjmp() в безопасную точку программы за пределами анализатора.

Если вы оставите код анализатора без изменений, могут выводиться сразу несколько сообщений о синтаксических ошибках. Конечно, в одних ситуациях это может мешать, но в других может быть очень полезным, поскольку появляется возможность выявить сразу несколько ошибок. Тем не менее, в общем случае перед тем как использовать анализатор в коммерческих программах, необходимо доработать его блок синтаксического контроля.


Содержание | <<< | >>>

C++ исходники. Все примеры - рабочие:

часы:

Dev C++ WinAPI Стрелочные часы Analog Clock

Dev C++ WinAPI Цифровые прозрачные часы. Текст на рабочем столе. Digital transparent clock. Text on desktop

Dev C++ OLE WinApi CALENDAR and DIGITAL CLOCK (15kb). Календарь и цифровые часы

Dev C++ OLE WinAPI Календарь и цифровые часы почти Vista SideBar всего 21kb

плееры:

Microsoft Visual C++ 2008 Direct Show DVD Mini Player 10.5kb

Dev C++ WinAPI Микро медиа плеер 3.5kb

Dev C++ WinAPI Мини медиа плеер 4.5kb

Dev C++ WinAPI Hint Всплывающая подсказка

Dev C++ WinAPI RECT - имитатор кнопки

Dev C++ WinAPI Заполнить ListBox

Dev C++ WinAPI Заполнить, редактировать, сохранить, загрузить ListBox (PlayList)

Dev C++ WinAPI Индикатор уровня

Dev C++ WinAPI MP3 Микро плеер Открыть с помощью...

Dev C++ WinAPI Своя кнопка

изображения:

Dev C++ GDI+ WinAPI Mini FotoResizer (16kb), изменяет размеры всех фото (JPG) до указанного размера в выбраной папке и её подпапках

Dev C++ WinAPI Сохранить BITMAP экрана, десктопа, окна, клиентской области.

Dev C++ WinAPI Изменить размер изображения BMP RESIZE. Загрузка изображений из ФАЙЛА, вывод на экран и сохранение в файл.

Dev C++ WinAPI Загрузка изображений из РЕСУРСОВ и вывод на экран.

Dev C++ GDI+ WinAPI. Преобразовать изображения из одного формата в другой (JPG в BMP, GIF, PNG и обратно ), используя дополнительные библиотеки GDI+. Загрузка изображений из файла и сохранение в файл.

Dev C++ GDI+ WinAPI масштабирование JPG RESIZE

Dev C++ OLE WinAPI. Преобразовать изображения из JPG в BMP, используя дополнительные библиотеки OLE. Загрузка изображений из РЕСУРСОВ и сохранение в файл.

Dev C++ OLE WinAPI преобразовать JPG в BMP, используя дополнительные библиотеки OLE. Загрузка изображений из ФАЙЛА и сохранение в файл.

Dev C++ OLE WinAPI масштабирование BMP RESIZE

разное:

Dev C++ WinAPI Dev C++ Преобразовать цвет точки экрана в HTML код

Dev C++ WinAPI NOTIFYICONDATA WS_EX_TOOLWINDOW Иконка в области уведомлений (notification area, tray, трей). Удалить с панели задач (taskbar).

Dev C++ WinAPI ShellExecute Создать ссылку на WEB сайт

Dev C++ WinAPI ShellExecute Создать окно со ссылкой на WEB сайт

Dev C++ WinAPI CreateProcess ShellExecute WinExec Запуск приложения из приложения

Dev C++ OLE WinAPI Создать регион Regions PopUp Меню Menu

Dev C++ FindFiles. Поиск файлов заданного типа (в примере *.JPG) в папке и её подпапках

библиотеки:

Скачать библиотеку GDI+ для Dev C++

Скачать справочнник с примерами языка C.