在scala中找到unclose字符串(词法分析)

时间:2013-09-19 08:47:35

标签: scala lexical-analysis

我正在为我的程序语言开发词法分析。我想生成具有开放报价但没有近距离报价的失败字符串。例如:“你好

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

       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
           (    
            '\"' ~ rep( chrExcept('\"', '\n','\t','\b','\f','\r', EofCh) ) ~ '\"' ^^ { case '\"' ~            chars ~ '\"' => StringLit(chars mkString "") } 
            |'\"' ~> failure("Unclosed string: "+"??") // I want produce fail string                                
            |EofCh ^^^ EOF
            |delim

       )
        }

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

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


}

Excample: 输入:“safs i output:ErrorToken(Unclosed string:“safs i)

你能帮我解决这个问题。 感谢。

1 个答案:

答案 0 :(得分:1)

我对你问题的回答

override def token: Parser[Token] = {
         // Adapted from StdLexical
           (    
            '\"' ~ rep( chrExcept('\"', '\n','\t','\b','\f','\r', EofCh) ) ~ '\"' ^^ { case '\"' ~            chars ~ '\"' => StringLit(chars mkString "") } 
            |'\"' ~> rep( chrExcept('\"', '\n','\t','\b','\f','\r', EofCh) ) ^^ {chars => ErrorToken(("\"" :: chars) mkString "")}
            |EofCh ^^^ EOF
            |delim

       )
        }