我有一个由许多子项组成的ANTLR语法。高级语法看起来像这样:
grammar MyGrammar;
import MyLocation, MyName, MyTime;
composite
: myname (WS+ mylocation)? (WS+ mytime)?
我编译MyGrammar.g4
以获得所需的Java代码,在解析John at 4:30pm
等项时一切正常。然而,我现在遇到的情况是,我需要将时间与复合项分开解析,例如4:30pm
。
目前看来,我必须在MyGrammarListener
和MyTimeListener
中复制代码来处理时间。有没有什么方法可以让MyGrammarListener
在看到mytime
时切换到MyTimeListener
,这样我就可以避免代码重复,或者我应该用不同的方式来处理它?
问题第一部分的答案是否定的,你不能这样做(至少从ANTLR 4.4开始)。请点击此处查看我的答案:
有可能让Antlr4从基本语法lexer生成lexer而不是general lexer吗?