2010-05-24 13 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 
} 
} 

UPDATE 1

이 질문에 대해 조언을 수행 한 후, 다음 문제는 컴파일이 너무 오래 지속되는 것입니다. 당신은 추출기 패턴으로 util.matching.Regex을 사용하려고

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

: 나는 경우 문의 2 제거하면 흥미롭게도, 나는 follwing을 컴파일러 오류가 발생 위. 이 클래스는 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 
     } 
    } 
} 

패턴 일치 버그 #1113를 해결하기 위해 중간 분할이다.

+0

힌트를 보내 주셔서 감사합니다. 불행히도 이것은 컴파일 문제를 해결하지 못하는 것 같습니다. – gruenewa

+0

아마도 "16 비트에 맞추기에는 너무 큰 오프셋"오류가 발생했을 것입니다. 이는 하나의 패턴 일치에서 많은 추출기를 사용하는 알려진 버그입니다. https://lampsvn.epfl.ch/trac/scala/ticket/1133 – retronym

+0

많은 도움을 주셔서 감사합니다. 이것은 내 문제를 해결합니다. – gruenewa