首页 > 解决方案 > 用于生成新编程语言语法的神经网络

问题描述

我最近需要为转译器(将一种脚本语言转换为另一种脚本语言)创建一个 ANTLR 语言语法。我突然想到谷歌翻译在翻译自然语言方面做得很好。我们拥有各种循环神经网络模型、LSTM,而 GPT-2 正在生成语法正确的文本。

问题:是否有一个模型足以训练语法/代码示例组合,以便在给定任意示例源代码的情况下输出新的语法文件?

标签: machine-learninggrammarcode-translationtranspilerlanguage-recognition

解决方案


我怀疑是否存在任何这样的模型。

主要问题是languages从 生成的,并且由于可用于各种源代码grammars的(组合)无限多,因此几乎不可能转换回来。parser trees

因此,在您的情况下,假设您在python code(1000 个示例代码)上进行训练,训练的结果语法将是相同的。因此,无论示例源代码如何,模型都会始终生成相同的语法。

如果您使用来自多种语言的训练样本,该模型仍然无法生成语法,因为它包含无限多的可能性。

您的谷歌翻译示例适用于现实生活中的翻译,因为小错误是可以接受的,但这些模型不依赖于为每种语言生成根语法。有一些工具可以翻译编程语言示例,但它们不生成语法,基于语法工作。

更新

如何学习grammarcode

在比较了一些 NLP 概念之后,我列出了可能出现的问题以及应对它们的方法。

  • 处理variable names,coding structurestokens.

    为了理解语法,我们必须将代码分解为最简单的形式。这意味着要了解代码中的每个术语的含义。看看这个例子

语法树

已经很简单的表达式被简化为解析树。tags我们可以看到树将表达式和每个数字分解为 a factor。这对于摆脱代码中的人为因素(例如变量名等)并深入了解实际语法非常重要。在 NLP 中,这个概念被称为词性标注。您必须开发自己的方法来进行标记,因为您知道该语言的语法,这很容易。

  • 了解关系

    为此,您可以tokenize减少代码并使用基于您正在寻找的输出的模型进行训练。如果您想编写代码,请使用类似此示例n grams的模型。该模型将学习语法,但提取它并不是一项简单的任务。您必须运行单独的代码来尝试提取模型学习的所有可能关系。LSTM

例子

代码片段

# Sample code
int a = 1 + 2;
cout<<a;

标签

# Sample tags and tokens
 int      a          =         1       +       2       ;
[int] [variable] [operator] [factor] [expr] [factor] [end]

如果有足够的数据存在,离开operator,exprkeywords应该无关紧要,但它们将成为语法的一部分。

这是帮助理解我的想法的示例。您可以通过更深入地了解计算理论并了解automata不同的工作原理来改进这一点grammars


推荐阅读