研究の一環として、特定の言語のパーサーを作成しようとしています。現在、次のコードを希望どおりに動作させるのに問題があります。
private def _uw: Parser[UW] = _headword ~ _modifiers ~ _attributes ^^ {
case hw ~ mods ~ attrs => new UW(hw, mods, attrs)
}
private def _headword[String] = "\".*\"".r | "[^(),]*".r
private def _modifiers: Parser[List[UWModifier]] = opt("(" ~> repsep(_modifier, ",") <~ ")") ^^ {
case Some(mods) => mods
case None => List[UWModifier]()
}
private def _modifier: Parser[UWModifier] = ("[^><]*".r ^^ (RelTypes.toRelType(_))) ~ "[><]".r ~ _uw ^^ {
case (rel: RelType) ~ x ~ (uw: UW) => new UWModifier(rel, uw)
}
private def _attributes: Parser[List[UWAttribute]] = rep(_attribute) ^^ {
case Nil => List[UWAttribute]()
case attrs => attrs
}
private def _attribute: Parser[UWAttribute] = ".@" ~> "[^>.]*".r ^^ (new UWAttribute(_))
上記のコードには、言語の一部しか含まれていません。時間とスペースを節約するために、言語全体の詳細にはあまり触れません。_uw メソッドは、最初の部分だけが文字列に存在する必要がありますが、3 つの部分で構成される文字列を解析することになっています。
_uw は、これらのテスト文字列を正しく解析できるはずです。
test0
test1.@attr
"test2"
"test3".@attr
test4..
test5..@attr
"test6..".@attr
"test7.@attr".@attr
test8(urel>uw)
test9(urel>uw).@attr
"test10..().@"(urel>uw).@attr
test11(urel1>uw1(urel2>uw2,urel3>uw3),urel4>uw4).@attr1.@attr2
したがって、見出し語が で始まり で終わる場合、"
二重引用符内のすべてが見出し語の一部と見なされます。で始まるすべての単語.@
は、二重引用符で囲まれていない場合、見出し語の属性です。
test5.
たとえば、test5 では、パーサーは見出し語およびattr
属性として解析する必要があります。.@ だけを省略し、その前のすべてのドットを見出しに含める必要があります。
したがって、見出しの後には、属性や修飾子を含めることができます。順序は厳密であるため、属性は常に修飾子の後に続きます。属性はあるが修飾子がない場合は、それまでのすべて.@
が見出し語の一部と見なされます。
主な問題は"[^@(]*".r
. など、あらゆる種類のクリエイティブな代替手段を試しまし"(^[\\w\\.]*)((\\.\\@)|$)".r
たが、何も機能しないようです。先読みや後読みはパーサーコンビネータにどのように影響しますか? 私は解析や正規表現の専門家ではないので、どんな助けも歓迎します!