我正在尝试学习如何使用 JavaCC 编写解析器。
我已经使用 JFlex 生成了一个词法分析器,它返回一个标记列表。每个令牌都是它自己的类。
我正在写生产规则,但例如,我不能写“;” 因为它不会接收分号,而是接收 TokenSemicolon 的实例?
我能做些什么?
此外,我对 TokenMangager 等感到困惑。我已经有一个词法分析器和我自己的兼容令牌类列表。这是什么?
请帮忙,因为我很困惑。
我正在尝试学习如何使用 JavaCC 编写解析器。
我已经使用 JFlex 生成了一个词法分析器,它返回一个标记列表。每个令牌都是它自己的类。
我正在写生产规则,但例如,我不能写“;” 因为它不会接收分号,而是接收 TokenSemicolon 的实例?
我能做些什么?
此外,我对 TokenMangager 等感到困惑。我已经有一个词法分析器和我自己的兼容令牌类列表。这是什么?
请帮忙,因为我很困惑。
你问了两个相关的问题:
“这是什么?” 我假设您的意思是:“什么是令牌管理器?”
令牌管理器是令牌对象的来源。每个 JavaCC 解析器都需要一个令牌源。顺便说一下,标记由 class 的对象表示Token
。有两种方法可以制作令牌管理器。
.jj
文件中的一组规则生成一个词法分析器。在这种方式下,它很像 JFlex。这是默认设置。USER_TOKEN_MANAGER=true
。然后 JavaCC 会生成一个 Java 接口,叫做TokenManager
. 您需要做的就是用您自己的类实现该接口。当然,您应该使用该类的对象构造解析器。“我能做些什么?”
有几种可能性。
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 的转换可能在很大程度上是机械的,因此快速而简单。在 JFlex 中,JavaCC 唯一没有好的解决方案是A / B
构造。
无论您采用哪种选择,请记住 JavaCC 希望每个选项Token
都有一个.kind
字段。这是一个整数,但您会在生成的 interface 中找到整数的符号名称FooConstants
。