2013-01-08 39 views
0

我正在學習如何在Scala中使用解析器,我試圖構建一個解析器(從StandardTokenParsers擴展)的文本文件,可以出現同一節點與其他節點類型中間鍵入。例如:在Scala中捕獲所有出現的交織節點與StandardTokenParsers

[NodeA上] ...

[節點B] ...

[節點A] ...

[節點A] ...

[節點A] ...

我如何可以捕獲所有實例的節點A並將它們存儲在集合中?我認爲repsep只能捕獲順序實例。

最後,我希望能夠將節點的所有實例存儲在不同的集合中。

這可能嗎?

回答

1

你想要的是一個解析器,它接受[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] 
""" 
) 
+0

葉氏。之後我可以處理創建的列表 – Dan

相關問題