1

空白などの区切り文字を使用せずに、いくつかのキーワードで入力を分割しようとしています。

object MyParser extends JavaTokenParsers {
  def expr = (text | keyword).+
  def text = ".+".r ^^ ("'"+_+"'")
  def keyword = "ID".r ^^ ("["+_+"]")
}

val p = MyParser
p.parse(p.expr, "fooIDbar") match {
  case p.Success(r, _) => r foreach print
  case x => println(x.toString)
}

これにより、以下のように出力されます。

>> 'hogeIDfuga'

でも本当にやりたいのはこういうこと。

>> 'hoge'[ID]'fuga'


textすべてのキャラクターを飲み込ん でいるようです。text[を含まない ]を表現しようとしましkeywordたが、できませんでした。正規表現またはスカラパーサーで表現する方法は? または他の解決策はありますか?

いくつかの投稿1 2を見たことがありますが、私の場合は機能しません。

4

1 に答える 1

3

まず、keywordは定数の単語なので、正規表現は必要ありません。プレーンな文字列で十分です。次に、 atextは文字列ではなく、 a を含まkeywordない文字列です。これを試して:

import util.parsing.combinator._

object MyParser extends JavaTokenParsers {
  def expr = (text | keyword).+
  def text = """((?!ID).)+""".r ^^ ("'"+_+"'")
  def keyword = "ID" ^^ ("["+_+"]")
}

val p = MyParser
p.parse(p.expr, "fooIDbar") match {
  case p.Success(r, _) => r foreach print
  case x => println(x.toString)
}

何かという正規表現の書き方のコツについては、こちらnot matchingを読んでください。

于 2012-07-14T01:31:32.767 に答える