4

私はパーサーを書いています。その部分の 1 つが一致し、二重引用符で囲まれた文字列コンテンツを取得する必要があります。文字列全体ではなく、引用符のみが生成されます。引用されていないものについては、すべてうまくいきます

対応するルールは次のとおりです。

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

問題は:

  • 入力 -> 「ディレクティブ」
  • 予想される出力 -> StringWrapper("\"directive\"")
  • 実際の出力 -> StringWrapper("\"")
4

2 に答える 2

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(), '"');
}
于 2014-04-21T08:13:53.870 に答える
1

実は解決方法がわかりました!

このコードはうまく機能します。実際、私のIDEは、前の例のコードのこの部分を強調表示しました

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

タイプは Rule0 です。私はそれをRule1に強制しましたそして、今はうまくいきます。

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

def doubleQuoted: Rule1[StringWrapper] = rule { //same for singlequoted
  "\"" ~ doubleQouteBody ~ "\""
}
于 2014-03-28T12:59:52.380 に答える