2010-05-24 59 views
4

为什么下面的模块不能在Scala 2.8.RC [1,2]上编译?模式匹配语句中的Scala 2.8.0.RC2编译器问题?

object Test { 

import util.matching.Regex._ 

val pVoid = """\s*void\s*""".r 
val pVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r 
val pCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r 
val pIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r 
val pUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r 
val pFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r 
val pDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r 
val pShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r 
val pUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r 
val pInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r 
val pUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\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

在回答下面的意见后,接下来的问题是,编译时间太长。有趣的是,如果我的case语句的删除2以上我得到follwing编译器错误:

object Test { 

    import util.matching.Regex._ 

    val PVoid = """\s*void\s*""".r 
    val PVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r 
    val PCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r 
    val PIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r 
    val PUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r 
    val PFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r 
    val PDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r 
    val PShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r 
    val PUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r 
    val PInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r 
    val PUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\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) 

回答

3

您正在尝试使用util.matching.Regex作为提取模式。你可以这样做,因为这个类定义了unapplySeq方法。在模式匹配中,对提取器模式的引用必须以大写字母开头。

val PVoid = """\s*void\s*""".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*void\s*""".r 
    val PVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r 
    val PCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r 
    val PIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r 
    val PUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r 
    val PFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r 
    val PDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r 
    val PShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r 
    val PUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r 
    val PInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r 
    val PUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\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

+0

感谢您的提示,我不知道。不幸的是,这似乎不能解决编译问题。 – gruenewa 2010-05-24 11:42:48

+0

假设你得到了错误“偏移量太大而不适合16位”。这是一个在一个模式匹配中使用许多提取器的已知错误。 https://lampsvn.epfl.ch/trac/scala/ticket/1133 – retronym 2010-05-24 11:58:45

+0

非常感谢您的支持。这解决了我的问题。 – gruenewa 2010-05-24 12:10:12