2016-09-20 57 views
0

我是新來scala語言和它的解析器組合器。我工作的一個任務,並得到了被困在一個要求: 我的要求是得到重複的如Type :我創建解析器邏輯運算符和字(這意味着字符串)斯卡拉解析器組合器:處理重複的類型

def logicalOperator:Parser[Operator] = "(&&|\\|\\|)".r ^^ {case op => Operator(op)} 

def word: Parser[word] = """[a-z\\\s]+""".r ^^ { case x => word(x) } 

現在我的輸入可能包含由多個操作員分隔的單個單詞或重複單詞。 對於離:

input1=> once&&upon||time||forest. 

    input2=> therewasatime // this is also a valid input , it does not have any operators 

我將處理字作爲每them.In殼體之間的運營商沒有操作者存在(即輸入一個字,我將處理對單個單詞)。

&& operator and || operator would decide the operation. (we can consider it to be similar to && and || operator in case of boolean values , to understand clearly) 

我在想一個案例類句子,它將代表一個單詞以及多個單詞。而在多字的情況下,將含有operator.In情況下單的話,運營商和第二個字是空

case class Sentence(word1:Word, op:Operator, word2:Word). 

因此,這將是一個樹形結構的葉節點只包含Word和休息節點將包含運營商。

但我不知道如何寫句子解析器。 我嘗試使用:

def sentence = repsep(word,logicalOperator)^^{// creating sentence object here}. 

但我不能從repsep()操作提取操作。

對此案件的任何建議?

感謝

回答

0

repsep的問題是,是拋棄它的第二個參數的結果,你將無法識別使用了哪個運營商。 另一件事是:如果Sentence只能包含詞,而不是其他句子,您希望once&&upon||time||forest如何表示。在下文中,我假定你的意思是這樣的:

trait Node 
case class Operator(s: String) 
case class Word(s: String) extends Node 
case class Sentence(a: Node, op: Operator, b: Node) extends Node 

然後,你可以寫sentence這樣的:

def sentence: Parser[Node] = word ~ opt(logicalOperator ~ sentence) ^^ { 
    case w ~ Some(op ~ sentence) ⇒ Sentence(w, op, sentence) 
    case w ~ None    ⇒ w 
} 

使用這種方法,once&&upon||time||forest被解析爲

Sentence(
    Word(once), 
    Operator(&&), 
    Sentence(
     Word(upon), 
     Operator(||), 
     Sentence(
      Word(time), 
      Operator(||), 
      Word(forest) 
     ) 
    ) 
)