如何解决Pest语法中原子规则内联注释的分类与输出问题?
解决Fountain.io Pest语法中内联注释与文本原子化的冲突问题
以下是几个无需在应用层拼接字符的解决方案:
调整规则匹配顺序,优先识别注释
Pest的匹配逻辑是按规则定义顺序执行的,把note和boneyard规则放在text规则之前,确保注释片段被优先捕获,不会被文本规则误吞。示例代码:fountain = { (note | boneyard | text | newline)+ } note = { "[[" ~ (!"]]" ~ any)* ~ "]]" } boneyard = { "/*" ~ (!"*/" ~ any)* ~ "*/" } text = @{ (!note ~ !boneyard ~ any)+ }这里
text规则用否定前瞻排除了注释的起始标记,同时通过@实现原子化,既避免字符拆分冗余,又不会把注释识别为普通文本。拆分文本规则为基础片段+原子化组合
不要把复杂的换行、首尾空白逻辑直接塞进原子化的text规则里,先定义非原子的基础文本片段,再用原子化规则组合:text_fragment = { (!"[[" ~ !"/*" ~ any)+ } text = @{ text_fragment+ }这种方式既保证最终的
text是完整的原子节点,又通过text_fragment的排除逻辑,避免把注释开头当成文本内容。精细化文本字符范围,避免误匹配
如果文本的字符类型是可预测的,可以明确限定text规则允许的字符,同时排除注释的起始符号:text = @{ (!"[[" ~ !"/*" ~ (letter | digit | punctuation | whitespace))+ }这种方式能进一步缩小文本匹配的范围,减少注释被误判的概率。
给注释规则加上原子化标记
把note和boneyard规则也设为原子节点,确保整个注释片段被识别为一个完整单元,不会和文本规则交叉拆分:note = @{ "[[" ~ (!"]]" ~ any)* ~ "]]" } boneyard = @{ "/*" ~ (!"*/" ~ any)* ~ "*/" }
内容的提问来源于stack exchange,提问作者bjmc
相关产品推荐
相关产品推荐

