使用fastparse时SBT在VSCode中触发Whitespace类型比较警告
问题原因与解决方法
这个警告的核心原因是fastparse的空白处理机制出现了冲突:
- 你导入了
MultiLineWhitespace._,这会在当前作用域中引入全局的隐式空白解析器(MultiLineWhitespace.whitespace),让所有默认支持空白跳过的解析器组合符(比如~)自动处理空白。 - 而代码里用的
~~是显式强制跳过空白的组合符,它内部会使用NoWhitespace(不处理空白的规则)标记当前段不需要重复应用空白处理。 - 当
~~后跟rep(0)时,rep方法会尝试获取当前作用域的隐式空白规则,此时编译器检测到它在比较MultiLineWhitespace.whitespace和NoWhitespace.noWhitespaceImplicit这两个完全不同的单例对象,用ne比较永远返回true,因此抛出警告。
解决方法
任选一种方式即可消除警告:
- 替换
~~为~:因为已经全局导入了MultiLineWhitespace,~会自动处理空白,不需要额外用~~强制跳过,修改后代码:
def identifier[$: P] = P( CharIn("a-zA-Z_") ~ CharIn("a-zA-Z_0-9").rep(0)).!.map(x => Identifier(x))
- 给
rep显式指定空白规则:如果必须保留~~,可以显式告诉rep使用多行空白规则,避免隐式冲突:
def identifier[$: P] = P( CharIn("a-zA-Z_") ~~/ CharIn("a-zA-Z_0-9").rep(0)(MultiLineWhitespace)).!.map(x => Identifier(x))
- 取消全局空白导入:改为在解析器入口显式指定空白规则,比如:
import fastparse._ // 去掉全局的MultiLineWhitespace._导入 def identifier[$: P] = P( CharIn("a-zA-Z_") ~~/ CharIn("a-zA-Z_0-9").rep(0)).!.map(x => Identifier(x)) // 在解析入口指定空白规则 val parsed = parse("test123", identifier(_)(MultiLineWhitespace))
内容的提问来源于stack exchange,提问作者David Regan
相关产品推荐
相关产品推荐

