2012-09-19 2 views
2

저는 scala에서 새로 생겼습니다. 문자열 리터럴에 문제가 있습니다.ErrorToken 스칼라 수정/다시 작성

import scala.util.matching.Regex 
import scala.util.parsing.combinator.lexical.StdLexical 
import scala.util.parsing.combinator.token.StdTokens 
import scala.util.parsing.input.CharArrayReader.EofCh 

trait SimpleTokens extends StdTokens { 
    // Adapted from StdTokens 
    case class FloatLit(chars: String) extends Token { 
    override def toString = "FloatLit "+chars 
    } 
    case class IntLit(chars: String) extends Token { 
    override def toString = "IntLit "+chars 
    } 
    case class BooleanLit(chars: String) extends Token { 
    override def toString = "BooleanLit " + chars 
    } 
    case class StrLit(chars: String) extends Token { 

    override def toString = "\"" + chars.slice(1,chars.length-1) + "\"" 
    } 

} 

class SimpleLexer extends StdLexical with SimpleTokens { 
    import scala.util.parsing.input.CharArrayReader.EofCh 

    reserved ++= List("mod", "div", "array","if","then") 

    delimiters ++= List(";", "(", ")", "+", "-", "*", "/",".") 

    def regex(r: Regex): Parser[String] = new Parser[String] { 
    def apply(in: Input) = { 
     val source = in.source 
     val offset = in.offset 
     (r findPrefixMatchOf (source.subSequence(offset, source.length))) match { 
     case Some(matched) => 
      Success(source.subSequence(offset, offset + matched.end).toString, 
      in.drop(matched.end)) 
     case None => 
      Failure("string matching regex `" + r + "' expected but `" + in.first + "' found", in.drop(0)) 
     } 
    } 
    } 


    override def token: Parser[Token] = { 
    // Adapted from StdLexical 
    (
    regex("true|false".r)     ^^ { BooleanLit(_)} 
    |regex("[a-z][a-z]*".r)     ^^ { processIdent(_) }     
    |regex("""([0-9]*)(((\.)?[0-9]+(e|E)(\+|-)?[0-9]+)|(\.[0-9]+))""".r)    ^^ { FloatLit(_) } 
    |regex("\\d+".r)      ^^ { IntLit(_) } 
    |regex("""'([^'\"]|'')*'""".r)   ^^ {StrLit(_) } 
    |EofCh ^^^ EOF 
    |delim 
    ) 
    } 

    override def whitespace: Parser[Any] = rep(
    whitespaceChar 
     | '/' ~ '*' ~ comment 
     | '/' ~ '*' ~> failure("unclosed comment")) 

    override protected def comment: Parser[Any] = (
    '*' ~ '/' ^^ { case _ => ' ' } 
    | chrExcept(EofCh) ~ comment) 


} 

입력은 다음과 같습니다 : 여기 내 코드는 '이 문자열

입니다

출력해야한다 : ErrorToken (닫히지 않은 문자열 :'이 문자열)

하지만 실행할 때,이 나타납니다

ErrorToken ' 

identifier this 

identifier is 

identifier string 

정확한 출력을 얻으려면 어떻게해야합니까? 제발 도와주세요 !!! 내 문제를 고려 주셔서 감사합니다

답변

2

당신은 정규식에 수정할 수 있습니다

|regex("""(')[^']*(\t)""".r) ^^ ("Illegal tab in string:"+_) ^^ ErrorToken 
|regex("""(')[^']*""".r) ^^ ("Unclosed string:"+_) ^^ ErrorToken 

PPL-2012?

+0

오, 정말 고마워요! – user1680791