gpt4 book ai didi

c - 在没有完整 C 解析器的情况下检测 C 声明的开始和结束

转载 作者:太空狗 更新时间:2023-10-29 15:39:03 24 4
gpt4 key购买 nike

我想部分解析 C 声明和/或函数定义的列表。

也就是说,我想将它拆分成子字符串,每个子字符串包含一个声明或函数定义。

然后每个声明(分别)将被传递到另一个模块(该模块确实包含一个完整的 C 解析器,但我不能直接调用它。)

显然,我可以通过在我的程序中包含另一个完整的 C 解析器来做到这一点,但我希望避免这种情况。

到目前为止,我遇到的棘手案例涉及 '}' 是否终止声明/定义的问题。例如在

int main(int ac, char **av) {return 0;}

... '}' 是终止符,而在

typedef struct foo {int bar;} *pfoo;

不是。也可能有这样的病态代码:

struct {int bar;} *getFooPtr(...) { /* code... */ }

注意事项

  • 请假设 C 代码在我的函数看到它之前已经完全预处理。 (实际上它没有,但我们有一个解决方法。)
  • 我的解析器可能会在 Lua 中用 LPeg 实现

最佳答案

要在您的答案中扩展状态机以处理函数定义,请添加以下步骤:

  1. 将 fun/var 状态设置为“未知”
  2. 检查当前位置的字符
  3. 如果是;,我们就找到了声明的结尾,它不是一个函数定义(尽管可能是一个函数声明)。
  4. 如果是 "',跳转到匹配的引号,必要时跳过转义序列。
  5. 如果是(, [ or {, 跳转到匹配的), ]}(如有必要,递归地跳过嵌套的括号和字符串)
  6. 如果 fun/var state 是 'function' 而我们刚刚跳过了 { .. },我们就找到了声明的结尾,它是一个函数定义
  7. 如果 fun/var state 是“未知”并且我们刚刚跳过了 ( .. ),则将 fun/var state 设置为“function”。
  8. 如果当前字符是=,,设置fun/var state为'not-function`。
  9. 前进到下一个输入字符,然后返回到 2。

当然,这只适用于预处理后的代码——如果您有宏来执行各种尚未扩展的奇怪事情,那么所有的赌注都没有了。

关于c - 在没有完整 C 解析器的情况下检测 C 声明的开始和结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com