使解析器包含字符串文字中的周围空格

时间:2015-08-10 15:16:58

标签: scala parser-combinators

我为内部表达式语言编写了一个Scala解析器,该语言具有双引号分隔的字符串文字:

object MyParser extends JavaTokenParsers {
  lazy val strLiteral = "\"" ~> """[^"]*""".r <~ "\"" ^^ {
    case x ⇒ StringLiteral(x)
  }
  // ...
}

(实际代码有点不同,因为我支持""作为文字双引号的转义序列。虽然这与讨论无关,但这就是为什么我不能只使用{{1} }'JavaTokenParsers)。

我注意到解析器在字符串的开头和结尾都没有包含空格:

stringLiteral

我尝试在正则表达式中匹配空格:

"a"   parsed as StringLiteral("a")
" a"  parsed as StringLiteral("a")
"a "  parsed as StringLiteral("a")
" a " parsed as StringLiteral("a")

并使用显式"\"" ~> """\s*[^"]*\s*""".r <~ "\"" 解析器:

whiteSpace

但在这两种情况下,"\"" ~> whiteSpace.? ~ """[^"]*""".r ~ whiteSpace.? <~ "\"" 运算符已经消耗并忽略了空格,然后才有机会读取和处理它们。

我知道我可以设置~>,但我不愿意,因为一般来说我想在这种语言中允许任意空格围绕令牌。

在字符串文字中包含周围空格的简单而干净的策略是什么?

1 个答案:

答案 0 :(得分:1)

您可以选择使用单个正则表达式来表示字符串文字:

val stringLiteral:Parser[String] = """"([^"]*("")?)*"""".r

然后删除匹配的引号。