使用Parboiled提取双引号字符串内容

时间:2014-03-27 17:50:04

标签: scala parsing parser-generator parser-combinators parboiled

我正在编写一个解析器,其中一个部分应匹配并检索双引号字符串内容 它只产生引号,但不是整个字符串。对于不带引号的那些一切都很好

以下是相应的规则:

def doubleQuoted: Rule1[StringWrapper] = rule { //same for singlequoted
  "\"" ~ zeroOrMore( noneOf("\"\\") | ("\\" ~ "\"") ) ~ "\"" ~> StringWrapper
}

问题是:

  • 输入 - > “指令”
  • 预期输出 - > StringWrapper( “\” 指令\ “”)
  • 实际输出 - > StringWrapper( “\”“)

2 个答案:

答案 0 :(得分:2)

请注意,您可以使用normal* (special normal*)*模式来加快解析速度。在Java中:

Rule Normal()
{
    return NoneOf("\\\"");
}

Rule Special()
{
    return String("\\\"");
}

Rule NSN()
{
    return Sequence(
        ZeroOrMore(Normal()),
        ZeroOrMore(Special(), ZeroOrMore(Normal()))
    );
}

Rule DoubleQuotedString()
{
    return Sequence('"', NSN(), '"');
}

答案 1 :(得分:1)

其实我找到了解决方案!

此代码效果很好。实际上,我的IDE高举了我前面例子中的这部分代码

zeroOrMore( noneOf("\"\\") | ("\\" ~ "\"") )

的类型为Rule0。我强迫它去Rule1 而且,现在它有效。

def doubleQouteBody: Rule1[StringWrapper] = rule {
  zeroOrMore( noneOf("\"\\") | ("\\" ~ "\"") ) ~> StringWrapper
}

def doubleQuoted: Rule1[StringWrapper] = rule { //same for singlequoted
  "\"" ~ doubleQouteBody ~ "\""
}