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

如何使用ANTLR4解析存在重叠分隔符的维基文本?

解决ANTLR4解析维基文本时粗斜体分隔符重叠的问题

维基文本的格式规则中,''包裹斜体、'''包裹粗体,'''''则表示粗斜体(粗体嵌套斜体)。你的核心问题是解析器遇到5个连续单引号时,无法确定优先匹配粗体还是斜体分隔符,导致歧义。

问题根源

你当前的语法存在两个关键问题:

  • 词法规则未明确优先级:ANTLR词法分析会优先匹配先定义的规则,若ITALICS(2个单引号)在BOLD(3个)之前,会优先拆分5个单引号为''+''',而非正确的'''+''。
  • CHAR规则匹配所有字符,包括单引号,会干扰分隔符的识别,导致部分单引号被当成普通文本处理。

修正后的语法方案

1. 词法规则调整

使用ANTLR的模式(Mode)处理<nowiki>块,同时让BOLD优先于ITALICS定义,确保优先匹配更长的粗体分隔符;限制普通文本不匹配单引号和<,避免干扰分隔符和nowiki标签。

grammar WikiText;

// 默认模式:处理普通内容和格式标签
NOWIKI_OPEN: '<nowiki>' -> pushMode(NOWIKI_MODE);
BOLD: '\'\'\'';          // 粗体分隔符优先定义
ITALICS: '\'\'';
TEXT: ~['<]+;            // 匹配除单引号、<之外的普通文本

// NOWIKI模式:处理nowiki内的内容,不解析格式
mode NOWIKI_MODE;
NOWIKI_CLOSE: '</nowiki>' -> popMode;
NOWIKI_TEXT: .+?;        // 非贪婪匹配nowiki内的所有内容

2. 解析器规则调整

允许格式嵌套,明确wiki规则可包含普通文本或格式化文本,让解析器自动处理粗体嵌套斜体的情况:

document: (wiki | nowiki)* EOF;
nowiki: NOWIKI_OPEN NOWIKI_TEXT? NOWIKI_CLOSE;
wiki: (formattedText | TEXT)+;
formattedText: boldText | italicText;
boldText: BOLD wiki BOLD;   // 粗体可包含任意wiki内容(包括斜体)
italicText: ITALICS wiki ITALICS;

效果说明

当遇到'''''text'''''时,词法分析会先识别开头的'''(BOLD),接着识别''(ITALICS);结尾则先识别''(ITALICS),再识别'''(BOLD),最终解析为粗体包裹斜体的结构,符合维基文本的规则。<nowiki>块内的内容会被完整保留,不会解析任何格式分隔符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:29:58