gpt4 book ai didi

c++ - 代码生成期间的宏替换

转载 作者:行者123 更新时间:2023-11-28 08:34:16 25 4
gpt4 key购买 nike

目前我有一些遗留代码,它生成操作代码。如果代码有更多的宏,那么代码生成会花费很多时间(以小时计!!)。我已经完成了逻辑,他们正在通过搜索宏来处理宏,并通过内联之类的方式替换其中的每个变量。
有没有一种方法可以在不操作字符串的情况下对其进行优化?

最佳答案

在开始这种过程之前,您必须标记您的输入。 (我怎么推荐著名的 Dragon Book 都不为过——即使是古老的版本也经受住了时间的考验,更新后的 2006 版本看起来很棒)。编译是一种最好分成较小阶段的工作:如果你的第一阶段对标记执行词法分析,将行分成关键字、标识符、常量等,那么找到对宏的引用并查看它们就容易得多在符号表中。 (使用像 lex 或 flex 这样的工具或它们的现代等效工具之一来为您完成这项工作也比尝试从头开始做起来相对容易)。

“线索”似乎是如果代码有更多的宏,那么代码生成会花费很多时间。这听起来好像这个过程在宏的数量上是线性的,这肯定太多了。我假设这个过程一次一行发生(如果你的语言允许,显然这具有巨大的值(value),因为你不需要将程序视为一个巨大的字符串),伪代码看起来像

for(each line in the program)
{
for(each macro definition)
{
test if the macro appears;
perform replacement if needed;
}
}

这显然与宏定义的数量成正比。

通过标记化,它看起来像这样:

for(each line in the program)
{
tokenize the line;
for(each token in the line)
{
switch(based on the token type)
{
case(an identifier)
lookup the identifier in the table of macro names;
perform replacement as necessary;
....
}
}
}

这主要随着程序的大小(而不是定义的数量)而扩展 - 符号表查找当然可以使用比遍历所有数据结构更优化的数据结构来完成,因此不再成为重要因素。第二步是 yacc 和 bison(及其更现代的变体)等程序可以愉快地生成代码来完成的事情。

事后思考:在解析宏定义时,您也可以将它们存储为 token 流,并标记作为参数替换“占位符”名称的标识符.扩展宏时,切换到该 token 流。 (同样,flex 之类的东西可以轻松做到)。

关于c++ - 代码生成期间的宏替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/290436/

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