machine-learning - 用于生成新编程语言语法的神经网络
问题描述
我最近需要为转译器(将一种脚本语言转换为另一种脚本语言)创建一个 ANTLR 语言语法。我突然想到谷歌翻译在翻译自然语言方面做得很好。我们拥有各种循环神经网络模型、LSTM,而 GPT-2 正在生成语法正确的文本。
问题:是否有一个模型足以训练语法/代码示例组合,以便在给定任意示例源代码的情况下输出新的语法文件?
解决方案
我怀疑是否存在任何这样的模型。
主要问题是languages
从 生成的,并且由于可用于各种源代码grammars
的(组合)无限多,因此几乎不可能转换回来。parser trees
因此,在您的情况下,假设您在python code
(1000 个示例代码)上进行训练,训练的结果语法将是相同的。因此,无论示例源代码如何,模型都会始终生成相同的语法。
如果您使用来自多种语言的训练样本,该模型仍然无法生成语法,因为它包含无限多的可能性。
您的谷歌翻译示例适用于现实生活中的翻译,因为小错误是可以接受的,但这些模型不依赖于为每种语言生成根语法。有一些工具可以翻译编程语言示例,但它们不生成语法,基于语法工作。
更新
如何学习grammar
。code
在比较了一些 NLP 概念之后,我列出了可能出现的问题以及应对它们的方法。
处理
variable names
,coding structures
和tokens
.为了理解语法,我们必须将代码分解为最简单的形式。这意味着要了解代码中的每个术语的含义。看看这个例子
已经很简单的表达式被简化为解析树。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
,expr
和keywords
应该无关紧要,但它们将成为语法的一部分。
这是帮助理解我的想法的示例。您可以通过更深入地了解计算理论并了解automata
不同的工作原理来改进这一点grammars
。
推荐阅读
- c++ - 设置 SSL_CTX_set_cipher_list() 失败并出现“无密码匹配”错误
- python - 数组不会在 python 中分配超过 8 个字符
- ajax - 浏览器如何加载上一页的内容?
- amazon-web-services - 亚马逊 SDK .net。获取bucket网站url
- java - 在 Spring Boot 中处理休息控制器中的异常
- swift - 无法将所有 Firebase 数据显示到折线图
- python - 打开文本框时出现第二个弹出框
- python-3.x - 如何用点击鼠标python3移动矩形补丁
- sql - 如何将我的新专栏引用到现有专栏
- python - 如何使用 python jupyter 笔记本呈现面向对象的代码?