关于模式匹配语句的Scala 2.8.0.RC2编译器问题?

为什么以下模块不能在Scala 2.8.RC [1,2]上编译?
object Test {

import util.matching.Regex._

val pVoid = """s*voids*""".r
val pVoidPtr = """s*(consts+)?voids**s*""".r
val pCharPtr = """s*(consts+)GLchars**s*""".r
val pIntPtr = """s*(consts+)?GLints**s*""".r
val pUintPtr = """s*(consts+)?GLuints**s*""".r
val pFloatPtr = """s*(consts+)?GLfloats**s*""".r
val pDoublePtr = """s*(consts+)?GLdoubles**s*""".r
val pShortPtr = """s*(consts+)?GLshorts**s*""".r
val pUshortPtr = """s*(consts+)?GLushorts**s*""".r
val pInt64Ptr = """s*(consts+)?GLint64s**s*""".r
val pUint64Ptr = """s*(consts+)?GLuint64s**s*""".r

def mapType(t: String): String = t.trim match {
  case pVoid() => "Unit"
  case pVoidPtr() => "ByteBuffer"
  case pCharPtr() => "CharBuffer"
  case pIntPtr() | pUintPtr() => "IntBuffer"
  case pFloatPtr() => "FloatBuffer"
  case pShortPtr() | pUshortPtr() => "ShortBuffer"
  case pDoublePtr() => "DoubleBuffer"
  case pInt64Ptr() | pUint64Ptr() => "LongBuffer"
  case x => x
}
}
更新1 按照答案中的建议,下一个问题是编译持续时间太长。有趣的是,如果我删除上面的2个case语句,我会得到以下编译器错误:
object Test {

    import util.matching.Regex._

    val PVoid = """s*voids*""".r
    val PVoidPtr = """s*(consts+)?voids**s*""".r
    val PCharPtr = """s*(consts+)GLchars**s*""".r
    val PIntPtr = """s*(consts+)?GLints**s*""".r
    val PUintPtr = """s*(consts+)?GLuints**s*""".r
    val PFloatPtr = """s*(consts+)?GLfloats**s*""".r
    val PDoublePtr = """s*(consts+)?GLdoubles**s*""".r
    val PShortPtr = """s*(consts+)?GLshorts**s*""".r
    val PUshortPtr = """s*(consts+)?GLushorts**s*""".r
    val PInt64Ptr = """s*(consts+)?GLint64s**s*""".r
    val PUint64Ptr = """s*(consts+)?GLuint64s**s*""".r

    def mapType(t: String): String = t.trim match {
      case PVoid() => "Unit"
      case PVoidPtr() => "ByteBuffer"
      case PCharPtr() => "CharBuffer"
      case PIntPtr() | PUintPtr() => "IntBuffer"
      case PFloatPtr() => "FloatBuffer"
      case PShortPtr() | PUshortPtr() => "ShortBuffer"
      case PDoublePtr() => "DoubleBuffer"
      case PInt64Ptr() | PUint64Ptr() => "LongBuffer"
      case x => x
    }
}


Exception in thread "main" java.lang.Error:ch.epfl.lamp.fjbg.JCode$OffsetTooBigException: offset too big to fit in 16 bits: 43772
at ch.epfl.lamp.fjbg.JFieldOrMethod.writeTo(JFieldOrMethod.java:114)
at ch.epfl.lamp.fjbg.JClass.writeTo(JClass.java:315)
    
已邀请:
您正在尝试使用
util.matching.Regex
作为提取器模式。你可以这样做,因为这个类定义了一个
unapplySeq
方法。在模式匹配中,对提取器模式的引用必须以大写字母开头。
val PVoid = """s*voids*""".r

def mapType(t: String): String = t.trim match {
  case PVoid() => "Unit"
  case x => x
}
UPDATE 这是您的代码的完整,可编译版本:
object Test {

    import util.matching.Regex._

    val PVoid = """s*voids*""".r
    val PVoidPtr = """s*(consts+)?voids**s*""".r
    val PCharPtr = """s*(consts+)GLchars**s*""".r
    val PIntPtr = """s*(consts+)?GLints**s*""".r
    val PUintPtr = """s*(consts+)?GLuints**s*""".r
    val PFloatPtr = """s*(consts+)?GLfloats**s*""".r
    val PDoublePtr = """s*(consts+)?GLdoubles**s*""".r
    val PShortPtr = """s*(consts+)?GLshorts**s*""".r
    val PUshortPtr = """s*(consts+)?GLushorts**s*""".r
    val PInt64Ptr = """s*(consts+)?GLint64s**s*""".r
    val PUint64Ptr = """s*(consts+)?GLuint64s**s*""".r

    def mapType(t: String): String = t.trim match {
      case PVoid() => "Unit"
      case PVoidPtr() => "ByteBuffer"
      case PCharPtr() => "CharBuffer"
      case PIntPtr() | PUintPtr() => "IntBuffer"
      case x => x match {
        case PFloatPtr() => "FloatBuffer"
        case PShortPtr() | PUshortPtr() => "ShortBuffer"
        case PDoublePtr() => "DoubleBuffer"
        case PInt64Ptr() | PUint64Ptr() => "LongBuffer"
        case x => x
      }
    }
}
模式匹配被中途分解为变形bug#1113。     

要回复问题请先登录注册