使用Parsimonious解析含空项的逗号分隔字符串数组的语法问题
解决parsimonious解析空项数组的语法问题
你的核心问题是原语法没强制元素间必须用逗号分隔,导致连续字符串被误判合法。直接修改PEG规则就能在解析阶段拦截错误,不用等到AST遍历。
正确的语法规则
string = ~'"[^"]+"' comma = "," empty = "" # 空项对应None element = string / empty array = "(" (element comma)* element? ")"
规则说明
element定义数组单个项:要么是带引号的字符串,要么是空(对应None)array的结构强制元素间用逗号分隔:- 开头是
( - 重复匹配「元素+逗号」的组合(处理所有带逗号结尾的项,包括空项)
- 最后可选一个元素(处理末尾无逗号的项,或是整个数组为空的情况)
- 结尾是
)
- 开头是
这样修改后,("My""Cool""Array")会直接匹配失败:第一个"My"作为element后,规则要求接下来必须是comma,但后面直接是"Cool",不符合语法,解析阶段就会报错,不会误判合法。
而目标字符串(,,"My","Cool",,"Array",,,)能正常解析:开头(后,依次匹配「空项+逗号」「空项+逗号」「字符串+逗号」「字符串+逗号」「空项+逗号」「字符串+逗号」「空项+逗号」「空项+逗号」,最后匹配一个空项再闭合),完全符合规则。
内容的提问来源于stack exchange,提问作者user2209008
相关产品推荐
相关产品推荐

