Проблема с разбором в yacc - PullRequest
       15

Проблема с разбором в yacc

1 голос
/ 10 апреля 2011

У меня есть приложение, использующее сокеты .. клиентскую и серверную программу, такую ​​как 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», затем «Parsing done» и «Free OK») .. но затем он выдает эту синтаксическую ошибку в строке 1 ... я думаю, что из-за этого символа в конце строки ...

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

Спасибо .. :)

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Какой персонаж?Это всегда один и тот же?Это 0x0a, 0x0d или 0x00.Если это всегда один и тот же символ, который вы можете добавить, это необязательный конец строки для проанализированной строки в вашем файле .y.

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

1 голос
/ 10 апреля 2011

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

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

...