在 TreeListener 中拆分令牌以简化处理
Splitting Token for a Simplified Processing Within a TreeListener
在我的 ANTLR4 语法中,我使用了很多这样的规则:
subheadline
: SUBHEADLINE newlines
;
在我的词法分析器文件中,SUBHEADLINE ist 定义为:
SUBHEADLINE
: '##' (~[\r\n])+? '##'
;
生成的树看起来不错。但在处理过程中,我需要删除匹配令牌的两个“##”部分。这当然是可能的,但如果我可以将它们移动到不同的令牌中,那就太棒了。
我试过这样的事情:
subheadline
: SUB_START_END SUBHEADLINE SUB_START_END newlines
;
SUB_START_END
: '##'
;
SUBHEADLINE
: (~[\r\n])+?
;
但是输入不再被识别。例如这个字符串:
副标题文本 ## 导致以下错误:
line 1:0 mismatched input '## Subheadline Text ##' expecting '##'
我已经尝试过类似的方法:
SUBHEADLINE
: (~[\r\n#])+?
;
但是错误还是一样。我想我可以简单地将这些开始和结束字符移动到一个或两个专用标记中。
我错过了什么?
没有生成额外令牌的真正原因。令牌类型将内容标识为具有匹配的 ##
个字符串。因此,只需要实现一个自定义令牌,其中 getText()
方法打开令牌类型,对于 SUBHEADLINE
类型,去除前导和尾随 #
s。将自定义令牌工厂添加到词法分析器以生成自定义令牌。
在我的 ANTLR4 语法中,我使用了很多这样的规则:
subheadline
: SUBHEADLINE newlines
;
在我的词法分析器文件中,SUBHEADLINE ist 定义为:
SUBHEADLINE
: '##' (~[\r\n])+? '##'
;
生成的树看起来不错。但在处理过程中,我需要删除匹配令牌的两个“##”部分。这当然是可能的,但如果我可以将它们移动到不同的令牌中,那就太棒了。
我试过这样的事情:
subheadline
: SUB_START_END SUBHEADLINE SUB_START_END newlines
;
SUB_START_END
: '##'
;
SUBHEADLINE
: (~[\r\n])+?
;
但是输入不再被识别。例如这个字符串:
副标题文本 ## 导致以下错误:
line 1:0 mismatched input '## Subheadline Text ##' expecting '##'
我已经尝试过类似的方法:
SUBHEADLINE
: (~[\r\n#])+?
;
但是错误还是一样。我想我可以简单地将这些开始和结束字符移动到一个或两个专用标记中。
我错过了什么?
没有生成额外令牌的真正原因。令牌类型将内容标识为具有匹配的 ##
个字符串。因此,只需要实现一个自定义令牌,其中 getText()
方法打开令牌类型,对于 SUBHEADLINE
类型,去除前导和尾随 #
s。将自定义令牌工厂添加到词法分析器以生成自定义令牌。