你想要的是一個解析器,它接受[NodeA]或[NodeB]的序列。 所有你需要的,給定一個解析器nodeAParser
和解析器nodeBParser
,是使用|
組合子解析爲兩種[NodeA上]或[基站](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]
"""
)
葉氏。之後我可以處理創建的列表 – Dan