c - yacc解析的问题

标签 c parsing error-handling syntax-error 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”,然后是“Parsing done”和“Free OK”)..但是它在第 1 行给出了这个语法错误......我认为这是因为那个字符在行尾...

我该如何解决这个问题...

谢谢.. :)

最佳答案

如果你只是想修复这一个字符,你可以使用十六进制编辑器如hexer编辑文件,找到一个有趣的字符,更改它,保存并重新运行你的解析器。也许更标准的编辑器,如 vim 也可以很好地编辑文件,如果需要,修改环境肯定会更容易。

您可能希望在将查询保存到磁盘之前对其进行过滤;也许 isalnum(3)isalpha(3)isgraph(3)isprint(3) 会是一个有用的完整性检查工具,可以在将每个字符保存到磁盘之前检查它们。这样您就可以在提供错误输入时发出日志条目,这可能可以帮助您弄清楚为什么客户端首先向您发送格式不正确的输入。

关于c - yacc解析的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5609826/

相关文章:

parsing - Scala中Regex Parsers,Standard TokenParsers和JavaTokenParsers之间的区别

php - 检测 mysqli 准备语句中的错误

python - Python不检测单个字母,但是可以检测两个字母

c - 交换字符串按值而不是引用传递?

java - 如何在大文本文件的开头插入文本?

c - MPI分配奇数个处理器核时如何分配数据?

c++ - 获取 boost 命令行来解析我提供的数组而不是来自 main 的 argv - 模拟 argv

c - 将变化的数字分配给单个变量

parsing - 如何为散布元素列表编写秒差距解析器?

error-handling - 匹配 Result<T, E> 时返回错误的最简洁方法是什么?