【问题标题】:Is there a java-only equivalent to scala's parser generators?是否有与 scala 的解析器生成器等效的仅限 java 的?
【发布时间】:2011-11-07 20:40:02
【问题描述】:

Scala 有一种非常简单的方法来创建解析器。有没有一种相当等效的方法可以在仅使用 Java 的世界中做同样的事情而无需一周的学习曲线?

【问题讨论】:

  • 没有运算符重载和隐式?可能,但它可能会很远,far 使用起来更难看。
  • 是的,我不这么认为。上次我看 antlr 时,它是一头野兽。有没有好转?对于不是那么复杂的 DSL,我可以使用的最简单的库是什么 - 与 Markdown 的复杂性相似。
  • 等等,您是在询问一般解析(包括“外部”解析器生成器)还是“嵌入式”解析器组合器?我假设后者。但是,如果您使用带有自己的 DSL 的解析器生成器,那么它没有理由不应该是漂亮和轻量级的。
  • 好吧,两者都有。我喜欢 scala 的做法——bnf 表示法很棒。但是如果java没有这样的东西,我会用我能得到的最简单的东西。
  • 我实际上忘记了它的名字......我已经有一段时间没有使用它了。我曾经使用 scala 的 BNF 符号库。是组合器吗?我不记得了(对不起,已经好几个月了)。我会再次使用它,但我不能为此使用 scala :(

标签: java scala parsing text-parsing


【解决方案1】:

我不确定学习曲线,但在 Java 世界中,ANTLR Parser Generator 被认为是最好的。

【讨论】:

  • 我选择了 ANTLR。不过,我认为 ANTLR 不如 scala 解析器组合器好。在使用词法布尔成员进行解析时,我不得不给予它更多帮助。 scala 语法不需要这些。我认为 ANTLR 需要 dsl 作者的更多帮助才能完成我认为它可以自行推断的工作。无论如何,我设法让它工作,虽然我认为 scala 版本会更短,整体上也不那么复杂。而且也不会有代码生成。尽管如此,它还是达到了它的目的。
【解决方案2】:

解析器需要有多健壮和可配置程度如何?如果语法相当简单和稳定,您可以使用递归下降解析器,它使用表示每个语法产生规则的方法。我认为输出将大致是 JavaCC 将产生的,因为它们都是自上而下的。

http://en.wikipedia.org/wiki/Recursive_descent_parser

希望这可能会有所帮助。

【讨论】:

  • 这不是 ANTLR 生成的基本内容吗?
  • 是的,据我所知,这是真的。但是,学习和配置 ANTLR 可能需要与编写一个简单的 RD 解析器一样多的时间。使用解析器生成器的选择取决于项目的复杂性。
【解决方案3】:

Manning Publications 有一本书,“DSLs in Action”,一开始就介绍了 Java。

但是,您可能希望考虑使用 Groovy 来编写您的 DSL,因为动态语言有很多机会,而且它的学习曲线比 Scala 更短。

简介可以以http://docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages开头。

我提到的这本书还介绍了 antlr 的使用,以及何时使用以及何时没有意义,因此,如果您想更好地了解如何编写和维护 DSL,这是一本很棒的书。

【讨论】:

  • 如果 scala 不受限制,但 groovy 是可以接受的,我会感到惊讶。他似乎并不关心 scaala 的复杂性。他说他喜欢它,但由于某种未说明的原因不能使用它。
  • @Kevin - “周学习曲线”对我来说意味着复杂性可能是一个问题。 Groovy 的学习曲线要​​短得多。
  • 在 cmets 中他说不能使用 scala,而 antlr 是野兽。所以我把他的说法理解为纯 java 中“比 antlr 更简单的东西”,希望像 scala external dsls 一样简单。
  • 是的,我不觉得 scala 很难。事实上,我之前在 scala 中写过一个解析器,它和我想象的一样简单。我不觉得 scala 作为一门语言那么难——它比其他很多事情都容易,但我猜你的思维方式会让一些事情变得更容易,而另一些事情变得更难。人们对此产生的烟雾超出了应有的水平。老实说,解析库非常自然。我在几个小时内就有了一些可用的东西,我真的很喜欢这一切都是在 scala 中完成的,没有外部工具和文件。多语言会下地狱。
  • @egervari - 你可能会发现这本书很有用。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2010-09-25
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多