Fastparse编程式组合解析器时出现意外解析行为求助
问题分析与解决
你的代码存在两个关键问题,导致只有输入"d"时解析成功:
1. 未确保完全匹配输入
fastparse的parse函数默认仅要求解析器匹配输入的前缀就返回成功,不会校验输入是否被完全消耗。但你的需求是输入必须严格等于列表中的某个单词,因此需要在解析器末尾添加P(End),强制解析到输入的最后一个字符。
2. 解析器组合的冗余写法
你用map+reduce组合|的写法虽然理论可行,但fastparse提供了更简洁且不易出错的oneOf方法,专门用于匹配多个选项中的任意一个。
修正后的代码
import fastparse._ val words = List("a", "b", "c", "d") def reader[$: P] = P( oneOf(words) ~ End ) // 测试示例 println(fastparse.parse("a", reader(_))) // Success(()) println(fastparse.parse("d", reader(_))) // Success(()) println(fastparse.parse("ad", reader(_))) // Failure(...)
关键说明
oneOf(words):快速生成匹配列表中任意字符串的解析器,等价于你之前的map+reduce逻辑,但更简洁可读。~ End:确保解析器必须匹配到输入结尾,避免部分匹配的情况(比如输入"ad"时,不会因匹配了"a"就返回成功)。
如果坚持使用原有的reduce写法,只需补充End即可:
def reader[$: P] = words.map(f => P(f)).reduce((l, r) => l | r ) ~ End
修改后,输入"a"、"b"、"c"、"d"都会解析成功,其他不符合要求的输入(如"ad"、"x")则会失败。
内容的提问来源于stack exchange,提问作者dogengineer
相关产品推荐
相关产品推荐

