Scannerless Parser Generators

问题描述 投票:24回答:6

序言:尽管解析器识别的语言集(无上下文语法)严格大于扫描器之一(常规语法),但是大多数解析器生成器都需要扫描器。

((请不要试图解释其背后的原因,我非常了解它们)。

我看过解析器,不需要像这样的扫描器

不使用扫描仪具有某些优点:

  • 只是一个概念(无上下文语法),而不是两个
  • 在一个文件中解析多种语言(例如HTML / Javascript)
  • 解析没有保留关键字的语言(例如PL/1

通常,“解决方法”的使用类似于在解析器的请求上切换扫描仪。

问题:您是否知道其他无扫描程序的解析器生成器(任何语言)?这些是实用的(或纯粹是学术性的)吗?除了Tomita / GLR之外,还有其他方法吗?

答案:

  • [boost::spirit::qi by AraK] >>
  • 通过LPEG解析表达式语法(对于Lua为Norman Ramsey
  • [Yakker by Norman Ramsey] >>
  • [MBase by SK-logic] >>
  • [Waxeye by Trevor Robinson] >>
  • 序言:尽管解析器识别的语言集(无上下文语法)严格大于扫描器之一(常规语法),但是大多数解析器生成器都需要扫描器。 (请...

    另外两个:

    • Bryan Ford的语法分析表达式(PEG)不需要扫描仪。高效,懒惰的“ packrat解析器”是可选的。我对Lua LPEG版本有很好的经验,该版本可编译为高效的字节码计算机。非常实用。

  • YAKKER看起来仍然很吸引人,尽管它仍然清晰地处于释放前状态。他们正在使用声称是Earley解析算法的有效变体。

  • 我实际上是无扫描解析器的忠实拥护者;它们极大地简化了配置。简单地说,典型的扫描仪发生器使用起来并不有趣。在Lex的手册页中:

    The asteroid to kill this dinosaur is still in orbit.

    最后,我没有与Elkhound的亲身经历,但是我听到的二手报道令人印象深刻。我会说毫无疑问,但是some无扫描程序的解析器生成器非常实用。

    解析器生成器不需要需要扫描器。但是,如果您不使用它,那么您几乎疯了。

    由解析器生成器构建的解析器不在乎您提供给它们什么,只要您将它们称为令牌即可。

    要使用不带扫描仪的解析器生成器进行构建,只需将语法定义到字符级别,然后将单个字符作为标记提供给解析器。

    之所以疯狂,是因为解析是比词法分析更为复杂的活动。您可以将词法分析器构建为有限状态机,并将其转换为机器代码,就像“比较并跳转到下一个状态”一样。为了速度,这真的很难被击败。解析器生成器构造解析器,该解析器执行递归下降预测解析(对于大多数LL生成器,例如ANTLR),或者通过哈希,二进制或线性搜索等进行表查找。因此,解析器在令牌上花费的精力比词法分析器花费在令牌上的更多字符。

    如果将字符作为标记提供给解析器,则它将比等效的词法分析器花费更多的精力在字符上。如果您处理大量输入文本,那么最终将变得很重要,无论您是针对成千上万的小型输入流还是为数不多的大型输入流进行处理。

    相对于旨在使用令牌的GLR解析器,所谓的无扫描器GLR解析器会遭受此性能问题。

    [我的公司建立了一个工具 the DMS Software Reengineering Toolkit,它使用GLR解析器(并成功解析了您知道的所有常见语言和许多您不熟悉的语言,因为它具有GLR解析器)。我们知道无扫描器解析器,并且由于速度差异而选择不实施它们。我们有一个古典风格(但功能非常强大)的类似于LEX的子系统,用于定义词法标记。在DMS与处理相同输入的基于XT(具有无扫描仪GLR解析器的工具)的工具齐头并进的情况下,DMS的速度似乎是XT程序包的10倍。公平地说,所做的实验是临时性的,不会重复,但是由于我的怀疑,我认为没有理由重复该实验。 YMMV。当然,如果我们想不使用扫描仪,那么,正如我已经指出的那样,编写带有字符终端的语法非常容易。

    GLR无扫描程序解析器do

    具有另一个非常不错的属性,对大多数人来说都没有关系。您可以为无扫描程序的解析器采用两个单独的语法,并将它们按字面意义串联起来,但仍然可以获得解析器(通常有很多歧义)。当您构建一种嵌入另一种语言的语言时,这很重要。如果这不是您正在做的事情,那只是出于学术上的好奇心。

    而且,AFAIK,Elkhound并非没有扫描仪。 (对此我可能是错的)。(编辑:2/10:看起来我错了。这不是我生命中的第一次:)

    boost::spirit::qi不需要词法分析器,尽管您可以将boost::spirit::qi用作前端。从boost::spirit::lex的介绍开始:

    实际上,Spirit.Qi允许您编写无需使用词法分析器的语法分析器直接输入字符流,在大多数情况下,这就是方法自从精神被使用以来发明。

    boost::spirit::lex(原始版本)实际上确实按照您想要的方式工作,但已移至boost::spirit::lexboost::spiritboost::spirit::classic是精神的新设计,因此我省略了经典版本:)

    [spirit::qi:基于spirit::lex(PEG)的无扫描仪解析器。

    对不起,我要去死角了。您可以尝试一下-.NET的可嵌入PEG / Packrat实现:

    Waxeye

    parsing expression grammars

    我已经编写了“按需扫描”解析器。这是带扫描器的解析器与无扫描器的解析器之间的一种折衷。

    它允许使用“没有保留的关键字”,并使一种语言可以嵌入/嵌套在另一种语言中。

    [嵌套的一个很好的例子是来自graphviz http://www.meta-alternative.net/pfdoc.pdf的Dot语法,其中XML / HTML可以嵌入外部图形语言中。

    您可以在http://www.meta-alternative.net/mbase.html看到我的解析器和点语法的演示

    以及有关解析器的更多详细信息,可以在这里https://graphviz.gitlab.io/

language-agnostic parser-generator
6个回答
11
投票

另外两个:

  • Bryan Ford的语法分析表达式(PEG)不需要扫描仪。高效,懒惰的“ packrat解析器”是可选的。我对Lua LPEG版本有很好的经验,该版本可编译为高效的字节码计算机。非常实用。


9
投票

解析器生成器不需要需要扫描器。但是,如果您不使用它,那么您几乎疯了。

由解析器生成器构建的解析器不在乎您提供给它们什么,只要您将它们称为令牌即可。


3
投票

boost::spirit::qi不需要词法分析器,尽管您可以将boost::spirit::qi用作前端。从boost::spirit::lex的介绍开始:

实际上,Spirit.Qi允许您编写无需使用词法分析器的语法分析器直接输入字符流,在大多数情况下,这就是方法自从精神被使用以来发明。


3
投票

[spirit::qi:基于spirit::lex(PEG)的无扫描仪解析器。


1
投票

对不起,我要去死角了。您可以尝试一下-.NET的可嵌入PEG / Packrat实现:


0
投票

我已经编写了“按需扫描”解析器。这是带扫描器的解析器与无扫描器的解析器之间的一种折衷。

它允许使用“没有保留的关键字”,并使一种语言可以嵌入/嵌套在另一种语言中。

[嵌套的一个很好的例子是来自graphviz http://www.meta-alternative.net/pfdoc.pdf的Dot语法,其中XML / HTML可以嵌入外部图形语言中。

© www.soinside.com 2019 - 2024. All rights reserved.