flex写Java词法分析_如何在JavaCC解析器中使用JFlex词法分析器?

本文探讨了如何在JavaCC中使用JFlex生成的词法分析器,并解释了令牌管理器的作用及其创建方法。提供了三种解决方案,包括在JavaCC中重写JFlex代码、编写适配器类以及调整JFlex生成的词法分析器。
摘要由CSDN通过智能技术生成

我正在尝试学习如何使用

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中找到整数的符号名称.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值