【问题标题】:Neural Networks For Generating New Programming Language Grammars用于生成新编程语言语法的神经网络
【发布时间】:2019-10-02 02:21:31
【问题描述】:

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

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

【问题讨论】:

  • 不,不幸的是,程序员仍然需要思考才能编写程序。当然,如果您的工作是编写程序,您可能会认为这是一件好事。
  • 我的意思是生成一个 ANTLR 语法文件。不写新软件。
  • Facebook 不是因为这个问题而不得不关闭他们的人工智能吗?如果它是自动生成的,那么它可能无法理解。

标签: machine-learning grammar code-translation transpiler language-recognition


【解决方案1】:

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

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

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

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

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

更新

如何从code学习grammar

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

  • 处理variable namescoding structurestokens

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

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

  • 理解关系

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

示例

代码sn-p

# 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 的工作原理来改进这一点。

【讨论】:

  • 你关于大搜索空间的观点很好,但我看到了一个神经网络,它可以生成通过编译器检查的 C 代码。该代码没有做任何特定的事情(它是随机语句),但它首先通过编译器这一事实并不意味着神经网络实际上至少可以生成有用的 ANTLR 语法(或它自己的任意转译器) )?
  • 问题是,解析器/语法是文本表示到语言结构的一对一映射。那么这不是大大缩小了一般意义上的学习任务吗?我的直觉(我可能是错的)是这不是无限的可能性爆炸。
  • 请参阅@Jakub 的另一个答案。我增加了赏金。
  • 我深入了解了一些 NLP 概念以及如何实现它们以克服我之前提到的缺点。
【解决方案2】:

您所描述的只是上下文无关语法的学习结构。

我不确定这种方法是否真的适用于您的情况,但这是 NLP 中长期存在的问题:grammar induction for Context-Free Grammars。可以在 Charniak 的Statistical Language Learning 中找到如何使用统计学习方法解决此问题的示例介绍。

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

【讨论】:

  • 对。这就是为什么我认为它不像“学习编程”那样困难,而是“学习编程语言的语法”。这是两个非常不同的任务。这个答案可能是我得到的最好的答案。我们将在接下来的几天内看到。谢谢。
  • 好吧,将其与学习编程进行比较是愚蠢的,因为编程实际上需要语义,而您所要求的纯粹是句法。您感兴趣的问题实际上应该比 NLP 问题更容易,因为大多数编程语言都有明确的语法,并且作为 LL 的事实增加了额外的结构 - 但我不确定是否有人确实做了任何利用这些事实的事情。跨度>
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2021-02-05
    • 2020-05-03
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多