Страница 37 из 37
Проверка синтаксиса в программе рекурсивного нисходящего синтаксического разбора При синтаксическом разборе выражений синтаксическая ошибка - это ситуация, в которой входное выражение не удовлетворяет точным правилам, предъявляемым синтаксическим анализатором. В большинс- тве случаев синтаксические ошибки происходят по вине человека обычно при печатании. Например, следующие выражения не могут быть правильно разобраны описанным синтаксическим анализатором: 10**8 ((10-5)*9) /8 Первое выражение имеет два оператора подряд, во втором присутс- твуют несбалансированные скобки, а третье начинается с оператора деления. Так как синтаксические ошибки могут запутать синтакси- ческий анализатор и привести к ошибочным результатам, очень важна защита от них. При изучении программы синтаксического разбора вы возможно обратили внимание на функцию Serror, которая вызывается в различ- ных ситуациях. В отличие от других методов синтаксического разбо- ра при рекурсивном нисходящем синтаксическом разборе проверка синтаксиса осуществляется очень легко, так как в большинстве слу- чаев ошибки обнаруживаются в модулях Primitive, FindVar или level6, где проверяются скобки. Проверка синтаксиса имеет здесь только одну задачу: синтаксический анализатор не должен аварийно завершить при синтаксической ошибке. Это может вызвать генерацию множественных сообщений об ошибках. Чтобы добавить полное восстановление от ошибок, вы должны добавить глобальные переменные, которые проверяются на каждом уровне. Переменные сначала должны быть установлены в FALSE, а лю- бое обращение к Serror должно устанавливать их в TRUE, заставляя синтаксический анализатор преждевременно прекращать одну функцию. При таком построении программы может так случиться, что бу- дут выданы множественные сообщения об ошибках. Если в одних слу- чаях это будет раздражать, то в других будет полезным, так как дает возможность обнаружить несколько ошибок. В общем случае, од- нако, вы захотите усилить проверку синтаксиса перед тем, как ис- пользовать ее в коммерческой программе. |