2010-05-24 91 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