0

次のような文字列を解析できる単純な外部 DSL を Scala で構築しようとしています。

value = "john${tom}peter${greg}${sue}meg"

一般に、引用符で囲まれた部分文字列には、インターレースされた名前と、 と の間に置かれ${た名前が含まれます}

私の文法は次のとおりです。

class Grammar extends JavaTokenParsers {
  def workflow = "value" ~> "=" ~> "\"" ~> pair <~ "\""

  def pair = rep(str | token)

  def str = rep(char)

  def char: Parser[String] = """[a-z]""".r

  def token = "$" ~> "{" ~> str <~ "}"
}

および実行者:

var res = parseAll(workflow, str)
println(res)

def pair = rep(str | token)メソッドを使えばちゃんと解析できると思いました。機能しないだけでなく、parseAllメソッド内で無限ループにつながります。

そのような文字列をどのように解析できますか? 別の繰り返し ( rep) は正しいアプローチではないようです。

4

1 に答える 1

1

に置き換える必要がrepありrep1ます。

repは常に成功する ( でない限りError) ため、rep(char) | token右側の ( token) は役に立たない - の空の成功結果が得られますrep(char)

"""[a-z]""".rまた、 で置換するか、としてaccept('a' to 'z')定義することもできます。シングルに一致させるために を使用するのはやり過ぎです。strdef str: Parser[String] = """[a-z]+""".rRegexChar

于 2013-05-23T10:47:39.480 に答える