【发布时间】:2012-12-04 23:07:22
【问题描述】:
是否可以使用 lex 来扫描/解析来自套接字的数据?我该如何定义套接字?应该是 SOCK_STREAM 吗?我是否需要对我的 YY_INPUT 宏做一些花哨的事情,例如定义一个 select() 循环以确保解析器有数据?
谢谢
【问题讨论】:
是否可以使用 lex 来扫描/解析来自套接字的数据?我该如何定义套接字?应该是 SOCK_STREAM 吗?我是否需要对我的 YY_INPUT 宏做一些花哨的事情,例如定义一个 select() 循环以确保解析器有数据?
谢谢
【问题讨论】:
如果您使用的是 flex,那么您可以将 YY_INPUT 重新定义为您想要的任何内容。
应该是这样的:
#define YY_INPUT(buf,result,max_size) \
read up to max_size characters into buf \
result = (read worked) ? (number of characters read) : YY_NULL;
即使您在内存中的某处有字符,您也必须将它们复制到buf。这有点烦人,但它与flex 在每个输入块的末尾需要两个 NUL 字符有关,而且它不相信你把它们放在那里。
【讨论】:
您可以在SOCK_STREAM 上尝试fdopen(3),即TCP 套接字(您不能在UDP 套接字上真正这样做,因为您永远不会得到EOF),尽管使用带有@987654322 的套接字@streams 很容易出现问题,因为自动双缓冲(在内核和流中)。
您可以考虑使用 fmemopen(3) 滚动您自己的流,或者,如果您使用的是 Linux,甚至可以使用 fopencookie(3)。
【讨论】: