You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR4中以空格为分隔符的语法解析问题求助

ANTLR4解析问题解决方法

问题根源

  1. 丢失@符号:你的Callout规则大概率只捕获了@后面的内容,没把@本身纳入匹配范围。
  2. 匹配整个字符串:普通文本规则太宽泛,没有明确终止条件,导致它直接吞掉了包含@的所有内容——ANTLR的匹配优先级会优先选择更长、更靠前的规则,所以普通文本会覆盖Callout的匹配。

修正后的语法示例(Callout.g4)

grammar Callout;

// 顶层规则:输入由普通文本和Callout交替组成,直到结束
parse
    : (text | callout)+ EOF
    ;

// 普通文本:仅匹配非@的字符,遇到@就停止,避免吞掉Callout开头
text
    : ~[@]+
    ;

// Callout规则:明确包含@符号,覆盖两种格式
callout
    : AT NUMBER          # NumberedCallout
    | AT SLASH_STRING    # SearchCallout
    ;

// Token定义,把@单独作为一个Token,确保被捕获
AT          : '@';
NUMBER      : [0-9]+;
// 匹配/包裹的搜索字符串,允许中间包含任意非/的字符
SLASH_STRING: '/' ~[/]* '/';

关键说明

  • 顶层规则parse:强制输入拆分为普通文本和Callout的组合,避免整个字符串被识别为单一文本块。
  • text规则:用~[@]+限定只匹配非@的字符,一旦遇到@就触发Callout规则的匹配,从根源上防止普通文本吞掉Callout。
  • callout规则:直接引用AT Token,确保@符号被包含在匹配结果里,不会丢失。
  • 空白处理:不要添加WS : [ \t\r\n]+ -> skip;,因为输入中的空格属于普通文本的一部分,跳过会丢失这些空白内容;如果需要单独处理空白,可以调整规则,但当前需求下保留空白在text规则里更合适。

测试效果

解析输入This is some text @1 @2 @/searchstring/后,会得到以下拆分结果:

  • 普通文本:This is some text
  • Callout:@1
  • 普通文本:
  • Callout:@2
  • 普通文本:
  • Callout:@/searchstring/

扩展处理(可选)

如果需要支持转义的@(比如\@,代表普通的@符号而非Callout开头),可以修改语法:

text
    : (~[@] | ESCAPED_AT)+
    ;

ESCAPED_AT : '\\@';

内容的提问来源于stack exchange,提问作者Ray Offiah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:47:25