我正在学习如何使用JavaCC编写解析器。
我已经使用JFlex生成了一个词法分析器,它返回一个令牌列表。每个令牌都是它自己的类。
我正在编写生成规则,但是例如,我不能写";",因为它不会接收分号,而是接收token分号的实例。
我能做什么?
此外,我对tokenmanager等感到困惑。我已经有了一个词法分析器和我自己的兼容令牌类列表。这是什么?
请帮忙,因为我很困惑
你问了两个相关的问题:
"这是什么?"我假设您的意思是:"什么是令牌管理器?"
令牌管理器是令牌对象的来源。每个JavaCC解析器都需要一个令牌源。顺便说一下,这些令牌是由类Token
的对象表示的。有两种方法可以创建令牌管理器。
- 让JavaCC为您生成一个。JavaCC根据您放在
- 写你自己的。要做到这一点,设置选项
USER_TOKEN_MANAGER=true
。然后JavaCC将生成一个名为TokenManager
的Java接口。您所需要做的就是用您自己的类实现该接口。当然,您应该使用该类的对象来构造解析器。
.jj
文件中的一组规则生成一个词法分析器。在这方面,它很像JFlex。"我能做什么?"
有几种可能性。
- 在JavaCC中重写JFlex代码。然后JavaCC生成的令牌管理器将做本质上与JFlex词法分析器相同的事情,但它将实现正确的接口,并生成适当类型的令牌(即
- 说服JFlex生成可以与JavaCC一起使用的词法分析器。我不确定这是否可能,但如果可能,这可能是最好的选择。在本例中,使用
USER_TOKEN_MANAGER=true
。然后创建一个类:class FooLexer extends FooJLexLexer implements TokenManager { ...put constructors here... }
Token
)。写一个适配器类。使用JavaCC的USER_TOKEN_MANAGER=true
选项并编写一个适配器类来包装JFlex并实现TokenManager
接口。对于选项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
中找到整数的符号名称。