Scala Parser Combinators使用~运算符出现语义变更报错如何解决?
你使用~运算符的逻辑本身没有错误,这个报错是Scala编译器开启-Xmigration选项后触发的语义变更迁移提示,并非语法错误。
原因说明
- Scala 2.9版本对
Parser类的~方法做了语义调整:旧版本中~的右参数是传名参数,每次解析过程中用到该参数时都会重新求值;2.9及之后版本调整为仅在构造Parser对象时求值一次,后续解析复用该结果。 - 这个变更仅会影响右操作数需要动态求值、存在副作用的场景,你的代码中
COL()是静态的Token解析器,完全不受该语义变更影响。
解决办法
- 不需要保留迁移检查的话,直接在
build.sbt中移除-Xmigration编译选项即可消除报错:
scalacOptions -= "-Xmigration"
- 如果需要保留
-Xmigration选项,仅忽略该特定迁移警告,可以给对应代码添加@nowarn注解:
import scala.annotation.nowarn def label: Parser[Label] = positioned { (identifier ~ COL(): @nowarn("cat=migration")) ^^ { case IDENTIFIER(s) ~ _ => Label(s) } }
内容的提问来源于stack exchange,提问作者Daniele Tentoni
相关产品推荐
相关产品推荐

