Parsing ANTLR vs parboiled
在Java中,ANTLR和parboiled用于解析的区别是什么Parsing ANTLR vs parboiled,parsing,antlr,parser-generator,parboiled,Parsing,Antlr,Parser Generator,Parboiled,在Java中,ANTLR和parboiled用于解析的区别是什么 对于初学者来说,哪一个在语法分析中更容易使用 哪个更具可扩展性?(从简单语法到复杂语法) 哪一个对AST构建有更好的支持 对于语法错误,哪一种产生更好的错误或警告消息 哪一个问题比较少?(例如左递归、移位/减少冲突、减少/减少冲突) 与其他开源工具的比较也值得赞赏 Parboiled看起来是一个非常酷的工具。对于初学者来说,这可能更容易,因为这只是使用“解析器组合器”习惯用法的纯编程。我认为这将变得非常冗长和难以阅读,尽管Jav
- 对于初学者来说,哪一个在语法分析中更容易使用
- 哪个更具可扩展性?(从简单语法到复杂语法)
- 哪一个对AST构建有更好的支持
- 对于语法错误,哪一种产生更好的错误或警告消息
- 哪一个问题比较少?(例如左递归、移位/减少冲突、减少/减少冲突)
- 与其他开源工具的比较也值得赞赏
- 这是关于ANTLR的问题。在中也有很好的描述。一般来说,它有更好的文档
- 有用于不同IDE的ANTLR插件。他们将允许您查看AST并提供其他支持
- 您可以从控制台尝试ANTLR(如果我错了,请纠正我)
- 您可以将sbt add作为依赖项安装并在scala控制台中播放
- Parboiled看起来是一个非常酷的工具。对于初学者来说,这可能更容易,因为这只是使用“解析器组合器”习惯用法的纯编程。我认为这将变得非常冗长和难以阅读,尽管Java语法看起来并不像我看到的那么糟糕。我不能评论它的AST构造,但ANTLR4生成的解析树不是ASTs。它声称具有良好的错误消息/恢复,但这是可疑的,因为它基于解析器表达式语法,只有在看到整个输入时(最坏的情况下)才能检测错误。它也不能识别语法中的歧义(不是冲突、歧义)。这两种工具都不会宣布解析冲突。ANTLR 4处理算术表达式之类的直接左递归,但通常这两个工具都不能处理左递归。ANTLR要求您为它的解析器解释器使用一个库,比如parboiled,但是如果您想让它生成解析器,您必须学会使用该工具。目前,ANTLR 4可以用Java、C#、JavaScript、Python2、Python3生成解析器。今天,Parboiled主要是scala工具。所以,如果您使用scala,它可能是大多数情况下更好的解决方案
易用性
对于初学者来说,ANTLR应该容易得多。一开始就比较容易
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那个家伙的回答。现在,如果那个半熟的家伙出现了……我想peg解析器不会有歧义;如果上下文无关语法中存在这种情况,peg解析器将选择“第一种选择”并提交给它。因此,这与其说是没有检测到它们,不如说是简单地将它们定义为不存在。我对什么是好的解析机制的看法是,在Quora(对不起,在那里写了答案,而不是在So):