Combinator Definition出错,无法理解原因

时间:2015-04-06 03:53:37

标签: scala

我正在尝试编写一个简单的解析器,以便能够为RDBMS生成DDL,但却无法定义组合器。

import scala.util.parsing.combinator._
object DocumentParser extends RegexParsers {
  override protected val whiteSpace = """(\s|//.*)+""".r //To include comments in what is regarded as white space, to be ignored
  case class DocumentAttribute(attributeName : String, attributeType : String)
  case class Document(documentName : String, documentAttributeList : List[DocumentAttribute])
  def document : Parser[Document]= "document" ~> documentName <~ "{" ~> attributeList <~ "}" ^^ {case n ~ l => Document(n, l)} //Here is where I get an error
  def documentName  : Parser[String] = """[a-zA-Z_][a-zA-Z0-9_]*""".r ^^ {_.toString}
  def attributeList : Parser[List[DocumentAttribute]] = repsep(attribute, ",")
  def attribute : Parser[DocumentAttribute] = attributeName ~ attributeType ^^ {case n ~ t => DocumentAttribute(n, t)}
  def attributeName : Parser[String] = """[a-zA-Z_][a-zA-Z0-9_]*""".r ^^ {_.toString}
  def attributeType : Parser[String] = """[a-zA-Z_][a-zA-Z0-9_]*""".r ^^ {_.toString}
}

似乎我已正确定义它。是否有一些我不知道的东西或者我不明白的组合器的基本原理?谢谢!

1 个答案:

答案 0 :(得分:0)

您必须使用以下代码document

def document : Parser[Document]= "document" ~> documentName ~ ("{" ~> attributeList <~ "}") ^^ {case n ~ l => Document(n, l)}

请注意~之后的documentName"{" ~> attributeList <~ "}"周围的括号。否则,所有<~~>将放弃除attributeList之外的所有内容。

基本上,没有任何括号,结果是丢弃最左边<~右边的所有内容,然后丢弃最右边~>左边的所有内容。例如:

def foo: Parser[String] = "a" ~> "b" ~> "c" ~ "d" <~ "e" ~> "f" <~ "g"
                         |<-discarded->|         | <-   discarded  -> |

通过此更改,您的代码可以正常运行:

scala> DocumentParser.document(new CharSequenceReader(
  """ document foo {bar baz, // comment 
    | qaz wsx}""".stripMargin))
res4: DocumentParser.ParseResult[DocumentParser.Document] = [2.10] parsed: Document(foo,List(DocumentAttribute(bar,baz), DocumentAttribute(qaz,wsx)))