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

Neural Networks For Generating New Programming Language Grammars

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

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

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

主要问题是 languages 是从 grammars 生成的,并且几乎不可能转换回来,因为 parser trees(组合)可用于各种source-codes.

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

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

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

更新

如何从 code 学习 grammar

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

  • 处理 variable namescoding structurestokens

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

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

  • 了解关系

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

例子

代码片段

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

标签

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

如果有足够的数据,保留 operatorexprkeywords 应该无关紧要,但它们将成为语法的一部分。

这是一个示例,可以帮助理解我的想法。您可以通过更深入地了解 Theory of Computation 并了解 automata 和不同的 grammars.

的工作原理来改进这一点

我对 ANTLR 一无所知,但是有很多很好的翻译自然语言的例子,例如进入有效 SQL 请求:http://nlpprogress.com/english/semantic_parsing.html#sql-parsing.

您描述的是 'just' Context-Free 语法的学习结构。

我不确定这种方法是否真的适用于您的情况,但这是 NLP 中的一个 long-standing 问题:grammar induction for Context-Free Grammars. An example introduction how to tackle this problem using statistical learning methods can be found in Charniak's Statistical Language Learning.

请注意,我描述的是一般的 CFG,但您可能需要检查 LL 语法的归纳,因为解析器生成器主要使用这些类型的语法。