我正在尝试学习如何使用
JavaCC编写解析器.
我已经使用JFlex生成了一个词法分析器,并返回一个令牌列表.每个令牌都是它自己的类.
我正在写生产规则,但是,例如,我不能写“;”因为它不会收到分号,而是TokenSemicolon的实例?
我能做什么?
另外,我对TokenMangager等感到困惑.我已经有了一个词法分析器和我自己的兼容令牌类列表.这是什么?
请帮助,因为我很困惑.
最佳答案 你问两个相关的问题:
“这是什么?”通过它,我假设你的意思是:“什么是令牌管理器?”
令牌管理器是令牌对象的源.每个JavaCC解析器都需要一个令牌源.顺便说一句,令牌由Token类的对象表示.制作令牌管理器有两种方法.
>让JavaCC为您生成一个. JavaCC根据您放在.jj文件中的一组规则生成词法分析器.这样就像JFlex一样.这是默认值.
>写你自己的.要执行此操作,请设置选项USER_TOKEN_MANAGER = true.然后JavaCC将生成一个名为TokenManager的Java接口.您需要做的就是使用您自己的类实现该接口.当然,您应该使用该类的对象构造解析器.
“我能做什么?”
有几种可能性.
>在JavaCC中重写您的JFlex代码.然后,JavaCC生成的令牌管理器将与JFlex词法分析器完全相同,但它将实现正确的接口,并将生成相应类型的令牌(即令牌).
>编写适配器类.使用JavaCC的USER_TOKEN_MANAGER = true选项并编写一个包装JFlex并实现TokenManager接口的适配器类.
>说服JFlex生成可与JavaCC一起使用的词法分析器.我不确定这是否可能,但如果是的话,它可能是最好的选择.在这种情况下,您将使用USER_TOKEN_MANAGER = true.然后上课:
class FooLexer扩展FooJLexLexer实现TokenManager {…把构造函数放在这里…}
对于选项3,您必须确保生成的词法分析器实际上实现了TokenManager所需的所有方法.如果您确实需要所有自己的令牌类,则可以让它们扩展生成的令牌类.
如果你使用选项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中找到整数的符号名称.