Scala解析child(1);false时出现‘end of input expected’错误求助
问题分析与解决方案
你的问题根源在于phrase函数的核心特性:它要求整个输入必须被解析器完全消耗,不能有任何剩余内容。
你当前的解析器变体只匹配了child(1)部分,解析完成后输入还剩;false未被处理,触发了phrase中if (in1.atEnd)的判断逻辑,因此返回end of input expected错误。
修复方案
1. 完整匹配整个输入(推荐)
如果;false是输入的固定后缀,需要让解析器覆盖整个字符串。注意如果输入中存在空格(比如child(1) ; false),要加入对可选空格的支持:
// 处理带可选空格的情况 val parser = "child" ~ "(" ~> numericLit <~ (")" ~ opt(whiteSpace) ~ ";" ~ opt(whiteSpace) ~ "false")
如果输入是严格无空格的child(1);false,你的第一个解析器变体理论上是可行的,检查是否存在输入拼写错误(比如多余的换行、空格)。
2. 跳过后续内容(不推荐,仅当不需要解析后续部分时使用)
如果只需要提取child(1)中的数字,不需要处理;false,可以直接使用解析器本身,而非phrase包装:
val parser = "child" ~ "(" ~> numericLit <~ ")" // 直接调用parser(input),而非phrase(parser)(input)
补充说明
从你提供的phrase实现代码可以明确看到:只要解析成功后输入未到达末尾(in1.atEnd为false),就会返回失败。这是phrase的设计初衷——确保输入完全符合解析规则,避免遗漏未处理的内容。
内容的提问来源于stack exchange,提问作者Muhammad Daniyal Danish
相关产品推荐
相关产品推荐

