StandardTokenParsersベースのパーサーで正規表現を使用しようとしています。そのために、StdLexicalを次のようにサブクラス化しました。
class CustomLexical extends StdLexical{
def regex(r: Regex): Parser[String] = new Parser[String] {
def apply(in:Input) = r.findPrefixMatchOf(in.source.subSequence(in.offset, in.source.length)) match {
case Some(matched) => Success(in.source.subSequence(in.offset, in.offset + matched.end).toString,
in.drop(matched.end))
case None => Failure("string matching regex `" + r + "' expected but " + in.first + " found", in)
}
}
override def token: Parser[Token] =
( regex("[a-zA-Z]:\\\\[\\w\\\\?]* | /[\\w/]*".r) ^^ { StringLit(_) }
| identChar ~ rep( identChar | digit ) ^^ { case first ~ rest => processIdent(first :: rest mkString "") }
| ...
しかし、これを利用するパーサーをどのように定義するかについて少し混乱しています。私は次のように定義されたパーサーを持っています:
def mTargetFolder: Parser[String] = "TargetFolder" ~> "=" ~> mFilePath
これは、有効なファイルパスを識別するために使用する必要があります。私はそれから試しました:
def mFilePath: Parser[String] = "[a-zA-Z]:\\\\[\\w\\\\?]* | /[\\w/]*".r
しかし、これは明らかに正しくありません。エラーが発生します:
scala: type mismatch;
found : scala.util.matching.Regex
required: McfpDSL.this.Parser[String]
def mFilePath: Parser[String] = "[a-zA-Z]:\\\\[\\w\\\\?]* | /[\\w/]*".r
^
StdLexicalサブクラスで作成された拡張機能を使用する適切な方法は何ですか?