必要なのは、[NodeA] または [NodeB] のシーケンスを受け入れるパーサーです。nodeAParser
parserと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]
"""
)