0

研究の一環として、特定の言語のパーサーを作成しようとしています。現在、次のコードを希望どおりに動作させるのに問題があります。

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たが、何も機能しないようです。先読みや後読みはパーサーコンビネータにどのように影響しますか? 私は解析や正規表現の専門家ではないので、どんな助けも歓迎します!

4

1 に答える 1

1

"[^@(]*".rあなたの問題とは何の関係もないと思います。私はこれを見る:

private def _headword[String] = "\".*\"".r | "[^(),]*".r

これは最初のものです_uw(ちなみに、Scala では名前にアンダースコアを使用することはお勧めしません)、したがって、 を解析しようとするtest5..@attrと、2 番目の正規表現がすべてに一致します!

scala> "[^(),]*".r findFirstIn "test5..@attr"
res0: Option[String] = Some(test5..@attr)

したがって、残りのパーサーには何も残されません。また、最初の正規表現_headwordも問題があり.*ます。これは、引用符を受け入れるためです。これは、次のようなものが有効になることを意味します。

"test6 with a " inside of it..".@attr

先読みと後読みに関しては、パーサー コンビネータにはまったく影響しません。正規表現が一致するかしないかのどちらかです。パーサー コンビネータが気にするのはそれだけです。

于 2012-02-22T20:21:12.023 に答える