用于生成新的编程语言语法的神经网络
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 names
、coding structures
和 tokens
。
为了理解语法,我们必须将代码分解成最低限度的形式。这意味着了解代码中每个术语的含义。看看这个例子
已经很简单的表达式被简化为解析树。我们可以看到树将表达式和 tags
每个数字分解为 factor
。这对于摆脱代码中的人为因素(例如变量名等)并深入研究实际语法非常重要。在 NLP 中,这个概念被称为 Part of Speech tagging。您必须开发自己的方法来进行标记,因为您知道该语言的语法,这很容易。
了解关系
为此,您可以 tokenize
减少代码并使用基于您正在寻找的输出的模型进行训练。如果您想编写代码,请使用使用 LSTM
的 n 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]
如果有足够的数据,保留 operator
、expr
和 keywords
应该无关紧要,但它们将成为语法的一部分。
这是一个示例,可以帮助理解我的想法。您可以通过更深入地了解 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 语法的归纳,因为解析器生成器主要使用这些类型的语法。
我最近需要为转译器(将一种脚本语言转换为另一种脚本语言)创建 ANTLR 语言语法。我突然想到 Google 翻译在翻译自然语言方面做得很好。我们拥有各种循环神经网络模型、LSTM 和 GPT-2 正在生成语法正确的文本。
问题:是否有足够的模型来训练 grammar/code 示例组合,以便在给定任意示例源代码的情况下输出新的语法文件?
我怀疑是否存在这样的模型。
主要问题是 languages
是从 grammars
生成的,并且几乎不可能转换回来,因为 parser trees
(组合)可用于各种source-codes.
因此,在您的情况下,假设您在 python code
(1000 个示例代码)上进行训练,训练的结果语法将是相同的。因此,无论示例源代码如何,模型将始终生成相同的语法。
如果您使用多种语言的训练样本,模型仍然无法生成语法,因为它包含无限多种可能性。
您的 Google 翻译示例适用于现实生活中的翻译,因为小错误是可以接受的,但这些模型不依赖于为每种语言生成根语法。有一些工具可以翻译编程语言example,但它们不会生成语法,而是基于语法工作。
更新
如何从 code
学习 grammar
。
在比较了一些 NLP 概念之后,我列出了可能出现的问题以及解决这些问题的方法。
处理
variable names
、coding structures
和tokens
。为了理解语法,我们必须将代码分解成最低限度的形式。这意味着了解代码中每个术语的含义。看看这个例子
已经很简单的表达式被简化为解析树。我们可以看到树将表达式和 tags
每个数字分解为 factor
。这对于摆脱代码中的人为因素(例如变量名等)并深入研究实际语法非常重要。在 NLP 中,这个概念被称为 Part of Speech tagging。您必须开发自己的方法来进行标记,因为您知道该语言的语法,这很容易。
了解关系
为此,您可以
tokenize
减少代码并使用基于您正在寻找的输出的模型进行训练。如果您想编写代码,请使用使用LSTM
的n 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]
如果有足够的数据,保留 operator
、expr
和 keywords
应该无关紧要,但它们将成为语法的一部分。
这是一个示例,可以帮助理解我的想法。您可以通过更深入地了解 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 语法的归纳,因为解析器生成器主要使用这些类型的语法。