内核空间中的词法分析器生成器

时间:2012-12-17 12:15:47

标签: kernel solaris lex flex-lexer

内核模块化调试器(kmdb)使用lex生成词法分析器以使用来自内核空间的 [1]。有一些黑客,其中一些甚至不兼容POSIX。

我有疑问:

  1. 在内核模式下使用lex有什么缺陷?
  2. 有没有合理的方法来采用[1] for flex [2]?
  3. 内核空间的lex / flex有哪些替代方案?
  4. (在最后的手段我将构建和使用illumos的lex,但我真的想避免它)

    [1] https://github.com/illumos/illumos-gate/blob/master/usr/src/cmd/mdb/common/mdb/mdb_lex.l

    [2] https://github.com/westes/flex/

1 个答案:

答案 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的缓冲区大小任意小。这应该可以从固定长度的字节数组中分配内存;我不知道你能做多少,但如果你小心的话,我猜你应该能把它降到几百字节。