我在学习如何使用JavaCC编写解析器。如何在JavaCC分析器中使用JFlex词法分析器?
我已经使用JFlex生成了一个词法分析器,并返回一个令牌列表。每个令牌都是它自己的类。
我正在编写生产规则,但是例如,我不能写“;”因为它不会接收分号,而是TokenSemicolon的一个实例呢?
我该怎么办?
另外,我对TokenMangager等感到困惑。我已经有了一个词法分析器和我自己的兼容令牌类的列表。这是什么?
请帮忙,因为我很困惑。
我在学习如何使用JavaCC编写解析器。如何在JavaCC分析器中使用JFlex词法分析器?
我已经使用JFlex生成了一个词法分析器,并返回一个令牌列表。每个令牌都是它自己的类。
我正在编写生产规则,但是例如,我不能写“;”因为它不会接收分号,而是TokenSemicolon的一个实例呢?
我该怎么办?
另外,我对TokenMangager等感到困惑。我已经有了一个词法分析器和我自己的兼容令牌类的列表。这是什么?
请帮忙,因为我很困惑。
你问了两个相关的问题: “这是什么”
由此我假定你的意思是:“什么是令牌管理器?”
令牌管理器是令牌对象的来源。每个JavaCC解析器都需要一个令牌源。顺便说一下,令牌由类Token
的对象表示。有两种方法可以制作令牌管理器。
.jj
文件中的一组规则生成一个词法分析器。这样就很像JFlex。这是默认设置。USER_TOKEN_MANAGER=true
。然后JavaCC将生成一个名为TokenManager
的Java接口。你所需要做的就是用你自己的类来实现这个接口。当然,您应该使用该类的对象构造解析器。“我能做什么?”
有几种可能性。
Token
)USER_TOKEN_MANAGER=true
选项并编写一个适配器类,它包装您的JFlex并实现TokenManager
接口。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
中找到整数的符号名称。