2015-10-21 67 views
4

我在学习如何使用JavaCC编写解析器。如何在JavaCC分析器中使用JFlex词法分析器?

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

我正在编写生产规则,但是例如,我不能写“;”因为它不会接收分号,而是TokenSemicolon的一个实例呢?

我该怎么办?

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

请帮忙,因为我很困惑。

回答

2

你问了两个相关的问题: “这是什么”

由此我假定你的意思是:“什么是令牌管理器?”

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

  1. 让JavaCC为您生成一个。 JavaCC根据您放入.jj文件中的一组规则生成一个词法分析器。这样就很像JFlex。这是默认设置。
  2. 写你自己的。要做到这一点设置选项USER_TOKEN_MANAGER=true。然后JavaCC将生成一个名为TokenManager的Java接口。你所需要做的就是用你自己的类来实现这个接口。当然,您应该使用该类的对象构造解析器。

“我能做什么?”

有几种可能性。

  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... }

选项3你必须确保生成的词法分析器真正实现所有TokenManager所需的方法。如果你真的需要所有的令牌类,你可以让它们扩展生成的Token类。

如果您使用选项2去,你的代码来构建解析器可能会看起来有点像这样

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

选项3是很有诱惑力的尝试。它可能是最简单的,如果它解决。

如果方案3不能解决问题,并且除非有令人信服的理由保留JFlex词法分析器,否则我会选择1.从JFlex到JavaCC的翻译很可能很大程度上是机械的,因此很容易。 JCC中唯一一个JavaCC没有很好的解决方案的是A/B结构。

无论您选择哪个选项,请记住,JavaCC预计每个Token都有一个.kind字段。这是一个整数,但是您会在生成的接口FooConstants中找到整数的符号名称。