【问题标题】:Parsing of double-quoted words with scala parser使用 scala 解析器解析双引号单词
【发布时间】:2016-04-19 21:47:46
【问题描述】:

我需要解析这样的东西(包括双引号)-“blablabla”

我的班级必须扩展 StdTokenParser。我的班级有这样的方法:

protected lazy val id: Parser[String] = "\"" ~ ident ~ "\"".? ^^ {case a ~ b ~ c => a + b + c}

这里的 ident 是 StdTokenParsers trait 的成员。

当输入为“blablabla”时效果很好(只有一个双引号),但当输入为“blablabla”时,它在解析过程中失败,并出现以下异常:

Exception in thread "main" java.lang.RuntimeException: [1.1] failure:     
``"'' expected but "blablabla" found

那么,有人可以帮帮我吗?

【问题讨论】:

  • ident 的具体实现是什么?为什么你把结束语作为可选?
  • @Łukasz def ident: Parser[String] =elem("identifier", _.isInstanceOf[Identifier]) ^^ (_.chars) 我将结束引号设为可选,仅用于测试。它不会影响结果。

标签: scala parsing


【解决方案1】:

StdTokenParsers 使用 StdTokens 在解析之前已经标记了字符串文字。

错误消息是因为第一个标记(整个字符串文字)与第一个预期标记 " 不匹配。

您可以使用来自StdTokenParsers 特征的stringLit 解析器并将其与字符串本身的解析器链接起来,或者定义您自己的不包含字符串文字的标记。

【讨论】:

  • stringLit 不适合我的情况,因为我需要分别解析以下情况:“case1”和“case2”。因此,如果它解析双引号标识符或单引号,它应该是我的程序的不同行为。你能解释一下如何定义我自己的令牌吗?
猜你喜欢
  • 2018-09-05
  • 2011-12-12
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多