用于生成新编程语言语法的神经网络

xen*_*ndi 8 grammar machine-learning code-translation language-recognition transpiler

最近,我有必要创建ANTLR语言语法,以实现编译器的目的(将一种脚本语言转换为另一种脚本语言)。在我看来,Google翻译在翻译自然语言方面做得很好。我们拥有各种各样的递归神经网络模型,LSTM和GPT-2,它们会生成语法正确的文本。

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

ski*_*ler 6

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

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

因此,就您的情况而言,假设您接受培训python code(1000个示例代码),则培训的结果语法将相同。因此,无论示例源代码如何,模型都将始终生成相同的语法。

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

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

更新资料

如何学习grammarcode

与一些NLP概念进行比较之后,我列出了可能出现的问题以及解决这些问题的方法。

  • 用处理variable namescoding structurestokens

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

语法树

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

  • 了解关系

    为此,您可以tokenize简化代码并根据所需的输出使用模型进行训练。如果您想编写代码,请n grams使用LSTM类似于此示例的模型。该模型将学习语法,但要提取语法并非易事。您将必须运行单独的代码以尝试提取模型学习到的所有可能的关系。

程式码片段

# Sample code
int a = 1 + 2;
cout<<a;
Run Code Online (Sandbox Code Playgroud)

标签

# Sample tags and tokens
 int      a          =         1       +       2       ;
[int] [variable] [operator] [factor] [expr] [factor] [end]
Run Code Online (Sandbox Code Playgroud)

保留operatorexpr并且keywords是否有足够的数据也没关系,但是它们将成为语法的一部分。

这是帮助理解我的想法的示例。您可以通过其在更深的外观改进这一计算的理论和理解的工作automata和不同grammars