我正在尝试学习如何使用JavaCC编写解析器。
我已经使用JFlex生成了一个词法分析器,并返回一个令牌列表。每个令牌都是它自己的类。
我正在编写制作规则,但例如,我不能写“;”因为它不会收到分号,而是接收TokenSemicolon的实例?
我该怎么办?
另外,我对TokenMangager等感到困惑。我已经有了一个词法分析器和我自己的兼容令牌类列表。这是什么?
请帮忙,因为我很困惑。
答案 0 :(得分:2)
你问两个相关的问题:
"这是什么?" 我认为你的意思是:"什么是令牌管理器?"
令牌管理器是令牌对象的来源。每个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的转换可能很大程度上是机械的,因此很快而且容易。 JFlex中唯一没有JavaCC没有良好解决方案的是A / B
构造。
无论您采取哪种方式,请记住,JavaCC希望每个Token
都有一个.kind
字段。这是一个整数,但您将在生成的接口FooConstants
中找到整数的符号名称。