我如何使用JFlex lexer与JavaCC解析器



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

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

我正在编写生成规则,但是例如,我不能写";",因为它不会接收分号,而是接收token分号的实例。

我能做什么?

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

请帮忙,因为我很困惑

你问了两个相关的问题:

"这是什么?"我假设您的意思是:"什么是令牌管理器?"

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

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

"我能做什么?"

有几种可能性。

    在JavaCC中重写JFlex代码。然后JavaCC生成的令牌管理器将做本质上与JFlex词法分析器相同的事情,但它将实现正确的接口,并生成适当类型的令牌(即Token)。写一个适配器类。使用JavaCC的USER_TOKEN_MANAGER=true选项并编写一个适配器类来包装JFlex并实现TokenManager接口。
  1. 说服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的转换可能在很大程度上是机械的,因此又快又容易。JFlex中唯一JavaCC没有好的解决方案的是A / B结构。

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

相关内容

  • 没有找到相关文章

最新更新