如何在JavaCC解析器中使用JFlex词法分析器?

时间:2015-10-21 19:57:20

标签: java parsing javacc parser-generator jflex

我正在尝试学习如何使用JavaCC编写解析器。

我已经使用JFlex生成了一个词法分析器,并返回一个令牌列表。每个令牌都是它自己的类。

我正在编写制作规则,但例如,我不能写“;”因为它不会收到分号,而是接收TokenSemicolon的实例?

我该怎么办?

另外,我对TokenMangager等感到困惑。我已经有了一个词法分析器和我自己的兼容令牌类列表。这是什么?

请帮忙,因为我很困惑。

1 个答案:

答案 0 :(得分:2)

你问两个相关的问题:

"这是什么?" 我认为你的意思是:"什么是令牌管理器?"

令牌管理器是令牌对象的来源。每个JavaCC解析器都需要一个令牌源。顺便说一下,令牌由类Token的对象表示。制作令牌管理器有两种方法。

  1. 让JavaCC为您生成一个。 JavaCC根据您放在.jj文件中的一组规则生成词法分析器。这样就像JFlex一样。这是默认设置。
  2. 自己写。要执行此操作,请设置选项USER_TOKEN_MANAGER=true。然后JavaCC将生成一个名为TokenManager的Java接口。您需要做的就是使用您自己的类实现该接口。当然,您应该使用该类的对象构造解析器。
  3. "我该怎么办?"

    有几种可能性。

    1. 在JavaCC中重写您的JFlex代码。然后,JavaCC生成的令牌管理器将与JFlex词法分析器完全相同,但它将实现正确的接口,并将生成相应类型的令牌(即Token。)
    2. 编写适配器类。使用JavaCC的USER_TOKEN_MANAGER=true选项并编写一个包装JFlex并实现TokenManager接口的适配器类。
    3. 说服JFlex生成可与JavaCC一起使用的词法分析器。我不确定这是否可能,但如果是,它可能是最好的选择。在这种情况下,您使用USER_TOKEN_MANAGER=true。然后上课: class FooLexer extends FooJLexLexer implements TokenManager { ...put constructors here... }
    4. 对于选项3,您必须确保生成的词法分析器实际实现TokenManager所需的所有方法。如果您确实需要所有自己的令牌类,则可以让它们扩展生成的Token类。

      如果选择选项2,构建解析器的代码可能看起来有点像

      TokenManager tm = new AdaptJFlexLexerToJavaCC( jflexLexer ) ;
      FooParser p = new FooParser( tm ) ;
      

      选项3很有吸引力。如果它成功,它可能是最简单的。

      如果选项3没有成功,除非有令人信服的理由保留JFlex词法分析器,否则我选择选项1.从JFlex到JavaCC的转换可能很大程度上是机械的,因此很快而且容易。 JFlex中唯一没有JavaCC没有良好解决方案的是A / B构造。

      无论您采取哪种方式,请记住,JavaCC希望每个Token都有一个.kind字段。这是一个整数,但您将在生成的接口FooConstants中找到整数的符号名称。