当表达式分成多行时,解析器组合器不会编译?

时间:2014-09-07 00:34:48

标签: scala parser-combinators

为什么组合器在分成多行时会发生阻塞,如下所示:

编译(因为所有在一个honkin大线上):

  protected lazy val create: Parser[LogicalPlan] =
    CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")"  ~ (MAPPED ~> BY ~> "(" ~> ident <~ "," ~ colFamilies <~ ")") <~ opt(";") ^^ {

不编译:

  protected lazy val create: Parser[LogicalPlan] =
    CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")"
  ~ (MAPPED ~> BY ~> "(" ~> ident <~ "," ~ colFamilies <~ ")") <~ opt(";") ^^ {


[error] /shared/hwspark/sql/hbase/src/main/scala/org/apache/spark/sql/hbase/HBaseSQLParser.scala:37: type mismatch;
[error]  found   : HBaseSQLParser.this.Parser[Seq[org.apache.spark.sql.catalyst.expressions.Expression]]
[error]  required: HBaseSQLParser.this.Parser[org.apache.spark.sql.catalyst.plans.logical.LogicalPlan]
[error]     CREATE ~> TABLE ~> opt(IF ~ NOT ~ EXISTS ^^^ { var notExists = true }) ~ ident ~ "(" ~> tableCols <~ ")"
[error]

1 个答案:

答案 0 :(得分:3)

看起来你正在违反Scala规则进行分号插入。要在第二行继续表达式,您需要确保在第一行的末尾没有插入分号。最简单的方法是使用运算符结束第一行(其右操作数将在下一行)。换句话说,尝试将~(MAPPED ...的前面移回到上一行的末尾。