内核模块化调试器(kmdb)使用lex生成词法分析器以使用来自内核空间的 [1]。有一些黑客,其中一些甚至不兼容POSIX。
我有疑问:
(在最后的手段我将构建和使用illumos的lex,但我真的想避免它)
[1] https://github.com/illumos/illumos-gate/blob/master/usr/src/cmd/mdb/common/mdb/mdb_lex.l
答案 0 :(得分:1)
你应该能够使用类似于illumos lex文件中的hack来获取flex的I / O控制权。或者您可以使用flex的字符串缓冲区功能。请参阅flex manual中的yy_scan_string和yy_scan_buffer。
yy_scan_string
将导致flex复制字符串,这可能是必要的,因为flex会在缓冲区进行时修改缓冲区的内容。如果您不关心这一点,并且想要避免复制和,那么您可以将两个 NUL放在输入的末尾而不是仅仅一个,然后你可以使用yy_scan_buffer
flex手册中还有一节介绍如何提供自己的内存分配功能(“Overriding The Default Memory Management”),这可能也是必要的。 Flex不会分配除缓冲区之外的大量内存,如果您提供自己的缓冲区,则可以使Flex的缓冲区大小任意小。这应该可以从固定长度的字节数组中分配内存;我不知道你能做多少,但如果你小心的话,我猜你应该能把它降到几百字节。