gpt4 book ai didi

parsing - 多种语言的 Alpha 重命名

转载 作者:行者123 更新时间:2023-12-02 09:39:36 25 4
gpt4 key购买 nike

我认为这是一个相当复杂的技术挑战:我希望能够以多种语言(尽可能多)可靠地对标识符进行字母重命名。这将需要对每种语言进行特殊考虑,我正在寻求有关如何通过共享代码最大限度地减少我需要做的工作量的建议。像已经支持多种语言的统一解析或抽象语法框架之类的东西会很棒。

例如,这里有一些 python 代码:

def foo(x):
def bar(y):
return x+y
return bar
x 的 alpha 重命名至 y更改 xy并保留语义。所以它会变成:
def foo(y):
def bar(y1):
return y+y1
return bar

看看我们如何需要重命名 yy1为了不破坏代码?这就是为什么这是一个难题。程序似乎必须非常了解范围的构成,而不仅仅是进行字符串搜索和替换。

我还想保留尽可能多的格式:注释、间距、缩进。但这不是 100% 必要的,它会很好。

有小费吗?

最佳答案

为了安全地做到这一点,您需要能够确定

  • 代码中的所有标识符(以及那些不是的东西,例如注释的中间)
  • 每个标识符的有效范围
  • 能够用新标识符替换文本中的旧标识符
  • 确定重命名标识符是否会导致另一个名称被隐藏的能力

  • 要准确确定标识符,您至少需要一个语言准确的词法分析器。 PHP 中的标识符看起来与 COBOL 中的标识符不同。

    为了确定有效性范围,您必须在实践中确定程序结构,因为大多数“范围”都是由这种结构定义的。这意味着您需要一个语言准确的解析器; PHP 中的作用域与 COBOL 中的作用域不同。

    要确定哪些名称在哪些范围内有效,您需要了解语言范围规则。您的语言可能会坚持标识符 X 将根据找到 X 的上下文引用不同的 X(考虑具有不同参数的名为 X 的对象构造函数)。现在您需要能够根据命名规则遍历作用域结构。单继承、多继承、重载、默认类型几乎都需要你为程序建立一个范围的模型,将标识符和对应的类型插入每个范围,然后从遇到标识符的点爬升。根据语言语义通过各种范围的程序文本。您将需要符号表、继承链接、AST 以及导航所有这些的能力。这些结构与 PHP 和 COBOL 不同,但它们共享许多共同的想法,因此您可能需要一个具有共同概念支持的库。

    要重命名标识符,您必须修改文本。在一百万行代码中,您需要仔细指出。修改 AST 节点是一种谨慎指向的方法。实际上,您需要修改与被重命名的标识符相对应的所有标识符;你必须爬过树才能找到它们,或者在 AST 中记录所有引用所在的位置,以便可以轻松找到它们。修改树后,您必须在修改 AST 后重新生成源文本。那是很多机器;查看我的 SO answer on how to prettyprint ASTs保留您合理建议的所有内容。
    (您的另一个选择是在 AST 中跟踪字符串文本的位置,
    和读取/修补/写入文件。)

    在更新文件之前,您需要检查您是否没有隐藏某些内容。考虑这个代码:
     {  local x;
    x=1;
    {local y;
    y=2;
    {local z;
    z=y
    print(x);
    }
    }
    }

    我们同意此代码打印“1”。现在我们决定将 y 重命名为 x。
    我们已经打破了范围,现在提到了打印语句
    从概念上讲,外部 x 是指由重命名的 y 捕获的 x。代码现在打印“2”,所以我们的重命名破坏了它。这意味着必须检查可能找到重命名变量的范围内的所有其他标识符,以查看新名称是否“捕获”了一些我们不期望的名称。 (如果打印语句打印 z,这将是合法的)。

    这是很多机器。

    是的,有一个框架几乎包含所有这些以及许多强大的语言前端。查看我们的 DMS Software Reengineering Toolkit .它具有生成 AST 的解析器、从 AST 生成文本的 pretty-print 、通用符号表管理机制(包括对多重继承的支持)、AST 访问/修改机制。它具有将 AST 转回文本的 pretty-print 制。它有 front ends for C, C++, COBOL and Java实现名称和类型解析(例如,实例化符号表范围和标识符到符号表条目映射);它具有许多其他尚未实现范围界定的语言的前端。

    我们刚刚完成了为 Java 实现“重命名”的练习。 (当然以上问题都出现了)。我们即将开始一个 C++。

    关于parsing - 多种语言的 Alpha 重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5836910/

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