0

私は Scala でパーサーを使用する方法を学んでおり、その間に他のノード タイプと同じノード タイプを出現させることができるテキスト ファイル用のパーサー (StandardTokenParsers から拡張) を構築しようとしています。例えば:

[ノードA] ...

[ノードB] ...

【ノードA】…

【ノードA】…

【ノードA】…

ノード A のすべてのインスタンスをキャプチャしてコレクションに保存するにはどうすればよいですか? repsep は連続したインスタンスしかキャプチャできないと思います。

最後に、ノードのすべてのインスタンスを異なるコレクションに格納できるようにしたいと考えています。

これは可能ですか?

4

1 に答える 1

1

必要なのは、[NodeA] または [NodeB] のシーケンスを受け入れるパーサーです。nodeAParserparserとparser が与えられた場合に必要なのnodeBParserは、コンビネータを使用して|[NodeA] または [NodeB] ( nodeAParser | nodeBParser)を解析し、コンビネータを使用*してそのシーケンスを受け入れることだけです ( (nodeAParser | nodeBParser).*)。

ダミーの例:

import scala.util.parsing.combinator.syntactical._
import scala.util.parsing.input._
abstract sealed class Node
case object NodeA extends Node
case object NodeB extends Node

object MyParser extends StandardTokenParsers {
  lexical.delimiters ++= Seq("[", "]")
  lexical.reserved ++= Seq("NodeA", "NodeB")
  lazy val nodeAP: Parser[Node] = "[" ~ "NodeA" ~ "]" ^^ { case _ => NodeA }
  lazy val nodeBP: Parser[Node] = "[" ~ "NodeB" ~ "]" ^^ { case _ => NodeB }
  lazy val nodesP: Parser[List[Node]] = phrase((nodeAP | nodeBP).*)
  def parse( s: String ) = { nodesP( new lexical.Scanner( s ) ) }
}

MyParser.parse(
"""
[NodeA]
[NodeB]
[NodeA]
[NodeA]
[NodeA]
"""
)
于 2013-01-08T20:08:05.107 に答える