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
相关产品推荐
相关产品推荐

