Java CUP:如何在生成的解析器的每次reduce操作后注入自定义函数?
CUP .cup文件全局注入reduce后回调的实现方法
完全可以实现,不需要手动修改生成后的解析器代码,仅通过.cup文件配置和少量自定义代码即可完成,常见实现方案有两种:
- 【全局重写规约方法方案(无需修改产生式)】
CUP生成的解析器默认继承自java_cup.runtime.lr_parser类,该类的reduce()方法是所有规约操作的统一入口,按以下步骤配置即可:
- 编写自定义解析器基类继承
java_cup.runtime.lr_parser,重写其中的reduce方法,在调用super.reduce()完成原生规约逻辑后,执行你的自定义函数即可,你可以在该方法中直接获取当前规约的产生式编号、符号栈内容等上下文信息。 - 在你的.cup文件头部添加声明:
extends 你的自定义基类全类名,后续生成的解析器会自动继承你写的基类,所有reduce操作执行完成后都会自动触发你定义的回调逻辑。
- 【批量注入产生式动作方案】
如果你的回调逻辑需要和具体产生式的返回值绑定,你可以直接在每个产生式的动作块末尾追加你的函数调用。如果产生式数量较多,可以写个简单脚本批量处理.cup文件的规则段,给所有产生式的动作末尾注入{ yourCustomFunc(/* 按需传入当前产生式的符号值 */); }即可。
注意:如果你的自定义函数需要抛出解析异常,直接在回调逻辑里抛出java_cup.runtime.Exception即可,会被解析器主循环正常捕获处理
内容的提问来源于stack exchange,提问作者BOB123
相关产品推荐
相关产品推荐

