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

TatSu解析器忽略方括号字符问题咨询及语法合理性确认

TatSu解析方括号问题分析

1. 你的EBNF语法是否允许方括号通过?

你的语法里text规则仅匹配[a-z]+,方括号[]并不属于这个范围,理论上应该触发解析错误。但实际未报错的原因是TatSu的隐式跳过行为——方括号在TatSu中被归类为「可隐式跳过的标点符号」,当解析器遇到无法匹配当前规则的字符时,会自动跳过这类字符(除非开启严格模式)。而()、{}不在默认的可跳过字符列表中,因此会触发解析失败。

2. 该现象是否为预期行为?

这是TatSu的预期行为,核心逻辑如下:

  • 当解析器无法匹配当前规则时,会检查字符是否属于默认的「可跳过非空白字符」集合,方括号在此集合内,因此被自动跳过;
  • ()、{}不在该集合中,遇到时会直接抛出解析失败;
  • 单独的[或]同样属于可跳过字符,因此不会报错。

若要禁用这种隐式跳过,只需在语法中添加@@strict指令,强制解析器对无法匹配的字符报错:

@@grammar::Markdown
@@strict
@@whitespace :: /[␟]/

start = pieces $ ;

text = text:/[a-z]+/ ;

pieces = {text}*
    ;

此时再解析[]就会触发错误,符合规则的预期逻辑。

3. 让TatSu将空格视为文本一部分的可靠方法

要实现空格作为文本的一部分,需做到三点:

  • 显式定义空白符:完全覆盖默认空白符规则,仅将你需要跳过的字符(比如单元分隔符␟)写入@@whitespace;
  • 在规则中包含空格:修改text规则的正则表达式,将空格纳入匹配范围,例如:
    text = text:/[a-z\s]+/ ;
    
  • 开启严格模式:通过@@strict避免隐式跳过行为,确保所有未被规则匹配的字符都会触发错误,防止空格被意外跳过。

修改后的完整语法示例:

@@grammar::Markdown
@@strict
@@whitespace :: /[␟]/

start = pieces $ ;

text = text:/[a-z\s]+/ ;

pieces = {text}*
    ;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:35:03