gpt4 book ai didi

python - 使用 Python 制作预处理器

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:23 25 4
gpt4 key购买 nike

我基本上需要用 Python 编写一个 C 预处理器,我四处搜索,因为我需要完全自定义我的代码并且对正在发生的事情有一个完美的理解,我最好自己写。

这就是我所在的位置:我首先解析一些头文件 (.h) 以找到 #define 关键字并构建一个包含所有已创建指令的字典(它们具有一个值)。然后我需要根据我之前找到的指令解析源文件 (.c)。我目前使用的检查代码是否需要处理的机制如下:我获取所有定义的名称及其值并执行 exec("define_name = define_value")(使用未指定时值为“1”)。然后解决条件,例如 #if defined DEFINE_1 || defined DEFINE_2 && (DEFINE_3 == 10) .... 我删除了 C 预处理器关键字,使它们成为 Python 风格,将生成 DEFINE_1 或 defined DEFINE_2 and (DEFINE_3 == 10)

最后我对该字符串使用 eval(...) 来找出结果。

问题是我想知道是否有必要使用 exec/eval 并且很多人都不愿意使用它们,是否有更好的解决方案?

最佳答案

当然 exec() 不是必需的,也不应该使用。我什至不确定你期望它做什么,因为它会调用一个 shell 来设置一个只存在于子 shell 中的变量。

通常,您应该避免使用 eval() 语句,因为这很少是正确的做法。

那么,你能做什么?

1) 首先,因为可以在一个语句覆盖前一个语句的地方编写程序,你不能预处理 .h 文件(甚至假设 #define你正在寻找的只是首先在 .h 文件中)并且让它工作。考虑一下:

#define foo 1
#if foo == 1
this line is true!
#endif
#define foo 0

如果您预处理所有内容,您会将“foo”设置为 1,然后设置为 0,然后稍后计算 #if。你不能那样做……

2) 更常见的做法是编写一个逐行解析器,一次处理每一行的内容。这样,您甚至可以编写一个递归函数来处理 #include 语句,这样您就可以只从 .c 文件开始,让它提取它正在使用的正确 header ,而不是要求指定它们以其他方式。

最后,您应该得到类似(在名为“read_file”的函数中)的结果:

# ... file opening not shown ...

for line in file:
includematch = re.match("#include\\s+\\"(.*)\\"", line)
if match:
# deal with an include statement by calling a function to process it
read_file(includematch.group(1), definedict)

definematch = re.match("#define\\s+(\\w+)\\s+(.*)")
if definematch:
# deal with define statements by saving it in a dict
definedict[match.group(1)] = definedict[match.group(2)]

#....

显然,如果我向您展示了整个解决方案(上面的代码算不上漂亮,但出于展示的目的,它是简洁的)我会为您解决您的问题(家庭作业?)。但以上是构建整个事物的更好方法,而不是您正在前进的路径。

关于python - 使用 Python 制作预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16940319/

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