Parsing ANTLR vs parboiled

Parsing ANTLR vs parboiled,parsing,antlr,parser-generator,parboiled,Parsing,Antlr,Parser Generator,Parboiled,在Java中,ANTLR和parboiled用于解析的区别是什么 对于初学者来说,哪一个在语法分析中更容易使用 哪个更具可扩展性?(从简单语法到复杂语法) 哪一个对AST构建有更好的支持 对于语法错误,哪一种产生更好的错误或警告消息 哪一个问题比较少?(例如左递归、移位/减少冲突、减少/减少冲突) 与其他开源工具的比较也值得赞赏 Parboiled看起来是一个非常酷的工具。对于初学者来说,这可能更容易,因为这只是使用“解析器组合器”习惯用法的纯编程。我认为这将变得非常冗长和难以阅读,尽管Jav

在Java中,ANTLR和parboiled用于解析的区别是什么

  • 对于初学者来说,哪一个在语法分析中更容易使用
  • 哪个更具可扩展性?(从简单语法到复杂语法)
  • 哪一个对AST构建有更好的支持
  • 对于语法错误,哪一种产生更好的错误或警告消息
  • 哪一个问题比较少?(例如左递归、移位/减少冲突、减少/减少冲突)
  • 与其他开源工具的比较也值得赞赏

    • Parboiled看起来是一个非常酷的工具。对于初学者来说,这可能更容易,因为这只是使用“解析器组合器”习惯用法的纯编程。我认为这将变得非常冗长和难以阅读,尽管Java语法看起来并不像我看到的那么糟糕。我不能评论它的AST构造,但ANTLR4生成的解析树不是ASTs。它声称具有良好的错误消息/恢复,但这是可疑的,因为它基于解析器表达式语法,只有在看到整个输入时(最坏的情况下)才能检测错误。它也不能识别语法中的歧义(不是冲突、歧义)。这两种工具都不会宣布解析冲突。ANTLR 4处理算术表达式之类的直接左递归,但通常这两个工具都不能处理左递归。ANTLR要求您为它的解析器解释器使用一个库,比如parboiled,但是如果您想让它生成解析器,您必须学会使用该工具。目前,ANTLR 4可以用Java、C#、JavaScript、Python2、Python3生成解析器。

      今天,Parboiled主要是scala工具。所以,如果您使用scala,它可能是大多数情况下更好的解决方案

      易用性 对于初学者来说,ANTLR应该容易得多。一开始就比较容易

      • 这是关于ANTLR的问题。在中也有很好的描述。一般来说,它有更好的文档
      • 有用于不同IDE的ANTLR插件。他们将允许您查看AST并提供其他支持
      Parboiled是一个scala库。您将看到语法突出显示,并在框外键入check。Parboiled1在大多数IDE中工作良好。Parbiled2没有(将很快在Idea中修复)。该库使用宏表达式,大多数IDE都不习惯使用它。这就是为什么你会把所有东西都染成红色

      但两者都很容易开始

      • 您可以从控制台尝试ANTLR(如果我错了,请纠正我)
      • 您可以将sbt add作为依赖项安装并在scala控制台中播放
      可伸缩性 在我看来,Parboiled更具可扩展性。因为您正在编写scala代码。您可以将解析器分解为多个scala特性,并将它们相互混合。您可以创建DateTime解析器,并将其与LogEvent解析器或$PROTOCOL\u NAME解析器混合使用。并且很容易重复使用它们。 对于parboiled1,您可以在运行时做一些调皮的事情。嗯,它给你力量。在某些情况下,您可以动态构造解析器。例如,您有日期时间格式,定义为字符串。您可以读取格式字符串并为其生成适当的解析器。甚至对于Parboiled2(它在编译时做很多事情)也是可能的。我不知道ANTLR是否有可能

      AST 我喜欢对AST的简单处理方法。它期望您定义。 所以在理想情况下,您将拥有一个不可变的案例类树。 您可以向树节点添加一些类似dsl的内容。例如,您可以为节点定义“\”方法,该方法返回具有指定名称的子级

      case class Node(value: String) {
        ....
        def \ (childName: String): Option[Node] =
          this.children.find(child => child.name == childName)
      }
      
      然后使用它:

      city \ "3rd street" \ "23"
      
      这使得使用AST的工作更加容易。 我希望有帮助

      用于生产
      • 如果您使用的是Parbocked,则必须将其添加到依赖项列表中。这就是全部。你会让一切都井然有序
      • 如果您使用的是ANTLR,那么必须首先生成*.java文件。并在每次更改语法时重新生成。在大多数情况下,语法并不经常改变。但根据我的经验,我曾经遇到过这样的情况:我们每两天就换一次语法。不过,你可能不会觉得这是个问题

      如果作为一名开发人员,我必须将最近使用这两种框架作为解析框架的新手进行比较,那么我有以下比较

      ANTLR 煮熟的 1. 一般来说,它有更好的文档,有自己的网站,有一本书(Terrence Parr的权威ANTLR参考),有多个git示例。 它有有限的文档,只能在git中使用。 2. 不同IDE都有ANTLR插件,可以查看规则的语法图,检查parseTree中的输入。这对编写规则很有帮助。 它没有任何IDE插件。 3. 这是一个java框架,用java编写。 这是一个Scala库/框架,如果我们用Scala编写解析器,它会很好。Parboiled2不支持java。因此,如果我们必须在java中使用它,我们需要旧的Parboiled1。 4. 在Antlr中,我们在.g4文件中分别编写解析规则或语法。我们首先需要生成对应于语法的*.java文件。每次我们改变语法时都会重新生成。 在Parboach中,我们必须在java本身中编写解析规则和语法。 5. 在antlr中,我们通过将输入传递给生成的*.java antlr类来获得ParseTree(类似于AST)。 在Parboach中,我们必须使用抽象数据类型,并在编写语法以获取AST时使用值堆栈来推送和弹出值。
      很难反对ANTLR那个家伙的回答。现在,如果那个半熟的家伙出现了……我想peg解析器不会有歧义;如果上下文无关语法中存在这种情况,peg解析器将选择“第一种选择”并提交给它。因此,这与其说是没有检测到它们,不如说是简单地将它们定义为不存在。我对什么是好的解析机制的看法是,在Quora(对不起,在那里写了答案,而不是在So):