Проблема с синтаксическим анализом в yacc

#c #parsing #error-handling #syntax-error #yacc

#c #синтаксический анализ #обработка ошибок #синтаксическая ошибка #yacc

Вопрос:

У меня есть приложение, использующее сокеты.. клиентская и серверная программа, подобная MySQL..

Я отправляю запросы от клиента на сервер, где находится анализатор….

Когда я получаю запрос от клиента на сервере, я записываю этот запрос в файл, а затем устанавливаю yyin в этот файл и вызываю yyparse().. Итак, вот как я разбираю входную строку..

Проблема в том, что при успешном выполнении запроса анализатор показывает «синтаксическую ошибку».. И когда я посмотрел на файл, в нем был нечитаемый символ… Итак, это означает, что анализатор пытается разобрать этот символ и, таким образом, выдает синтаксическую ошибку..

Как мне удалить этот символ из файла или просто как мне остановить анализатор от разбора символа…

Вот как выглядит результат синтаксического анализа:

 ----- 127.0.0.1 -----select nm from stud;�
--- end 127.0.0.1 ---
Select
Parsing done
Free    OK
1: syntax error
  

Как вы можете видеть, 127.0.0.1 — это имя файла, за которым следует его содержимое….
И после точки с запятой есть таинственный символ…

Убедитесь, что анализатор анализирует запрос (он выводит «Select», за которым следуют «Синтаксический анализ завершен» и «Свободно OK»).. но затем он выдает эту синтаксическую ошибку в строке 1 … я думаю, это из-за этого символа в конце строки…

Как мне решить эту проблему…

Спасибо .. 🙂

Комментарии:

1. Похоже, вы отправили слишком много символов от клиента. Дважды проверьте длину строки перед ее отправкой.

Ответ №1:

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

Возможно, вы захотите отфильтровать запросы перед сохранением их на диск; возможно, isalnum(3) , isalpha(3) isgraph(3) или isprint(3) было бы полезным средством проверки работоспособности для проверки каждого символа перед сохранением их на диск. Таким образом, вы могли бы выдавать записи журнала во время предоставления неверного ввода, что могло помочь вам выяснить, почему клиент отправлял вам неверно сформированный ввод в первую очередь.

Ответ №2:

Что это за символ? Это всегда одно и то же? Является ли это 0x0a, 0x0d или 0x00.Если это всегда один и тот же символ, вы можете добавить, что это необязательное окончание строки для анализируемой вами строки.y-файл.

Если он всегда отличается, то, вероятно, он отключен из-за одной ошибки в коде, который записывает файл на диск (или затем отправляет приложение, отправляющее слишком много символов). Это стоило бы проверить.