与Flex/Bison相比,使用ANTLR有什么缺点?

use*_*855 9 antlr bison jflex flex-lexer

几年前,我在本科学习期间一直在研究Flex,Bison.但是,我现在不记得了.最近,我听说过ANTLR.

  • 你会建议我学习ANTLR或者更好地刷一下Flex/Bison吗?
  • ANTLR的功能是否比Flex/Bison更多/更少?

Pav*_*aev 10

ANTLRv3是LL(k),可以配置为LL(*).后者特别容易编写解析器,因为您基本上可以使用EBNF.

此外,ANTLR生成的代码非常类似于您从头开始编写的递归下降解析器.它非常易读且易于调试,以查看解析无法正常工作或工作错误的原因.

Flex/Bison(或任何其他LALR解析器)的优势在于它更快.

  • @ajay,这就是差异的要点.对于某些构造,将它们写为正确递归更自然.对于其他人来说,将它们写成左递归是更自然的.也就是说,对于像你的例子所说的"1*(2 + 3) - 4"这样的简单语法,你宁愿写一些类似:`expr:term('+'|' - ')expr; 术语:因子('*'|'/')术语; factor:literal_number | '('expr')'`.哪一个更自然是一个有争议的问题,但请注意ANTLR如何不需要任何特殊的运算符关联构造 - 它是语法术语本身所固有的. (3认同)
  • 是.LALR更快,因为您可以使用表驱动的有限状态机.一旦它被像Bison这样的解析器生成器生成,那么调试它是不可理解的,几乎不可能,但它也非常快.由ANTLR实现的LL(k)使用递归下降解析,这有点慢. (2认同)