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

如何用ANTLR4实现常规文本中无需转义的嵌套类函数结构解析?

使用ANTLR4实现单引号外的函数匹配需求

你的核心需求是:仅解析单引号外部的$开头函数结构,单引号内部的所有内容(包括$、括号等)都视为普通文本,无需解析函数。这完全可以通过ANTLR4的**词法模式(Lexer Modes)**实现,解决原语法中TEXT令牌吞掉单引号内所有内容的问题。

修改后的语法

grammar Functions;

// 默认模式:处理单引号外的内容
FUNCTION_NAME : '$' [A-Za-z] [A-Za-z0-9]*;
LEFT_PAREN    : '(';
RIGHT_PAREN   : ')';
ESCAPE        : '\\' [$()\\'];
APOSTROPHE    : '\'' -> pushMode(STRING_MODE);
PLAIN_TEXT    : ~['$()\\]+; // 匹配除特殊字符外的普通文本

// 单引号内部模式:所有内容视为普通字符串
mode STRING_MODE;
STRING_ESCAPE : '\\' ['\\];
STRING_CONTENT: ~['\\]+;
STRING_END    : '\'' -> popMode;

// 解析器规则
start
    : element* EOF
    ;

element
    : function
    | APOSTROPHE STRING_CONTENT* (STRING_ESCAPE STRING_CONTENT*)* STRING_END // 完整单引号字符串
    | ESCAPE
    | PLAIN_TEXT
    ;

function
    : FUNCTION_NAME LEFT_PAREN param? RIGHT_PAREN
    ;

param
    : function
    | APOSTROPHE STRING_CONTENT* (STRING_ESCAPE STRING_CONTENT*)* STRING_END // 参数中的单引号字符串
    ;

关键改进说明

  • 词法模式切换:遇到'时切换到STRING_MODE,此时内部所有字符(包括$func2())都会被识别为普通字符串内容,不会触发函数相关的词法规则;遇到闭合'时切回默认模式,恢复函数解析逻辑。
  • 保留普通文本:原语法的PLAIN_TEXT : . -> skip会丢弃非函数/文本内容,现在改为~['$()\\]+,直接保留单引号外的普通文本,符合你“函数上下文外的字符视为常规字符”的需求。
  • 正确处理转义:单引号内外的转义字符(如\'、\\)都能被正确识别,不会破坏字符串或函数结构。

测试验证

对于输入文本 Text $func('A') 'text $func2()',解析结果会正确拆分:

  • Text 作为PLAIN_TEXT
  • $func('A') 作为function(其中'A'是参数中的字符串)
  • 'text $func2()' 中的'text $func2()'作为完整的单引号字符串,内部的$func2()不会被解析为函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:53:11