Scala Parser Combinators:处理类型的重复

时间:2016-09-20 13:04:08

标签: regex scala parsing parser-combinators

我是scala语言及其解析器组合器的新手。我正在完成一项任务,并且遇到了一项要求: 我的要求是重复Type 例如:我为逻辑运算符和word创建了解析器(这意味着字符串)

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

我会根据它们之间的运算符处理单词。如果没有运算符存在(即输入是单个单词,我会处理单个单词)。

&& 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。如果单个单词,运算符和第二个单词将为null

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

因此,这将是一个树结构,其中叶节点仅包含Word,而其余节点将包含运算符。

但我不知道怎么写Sentence Parser。 我尝试使用:

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

但我无法从repsep()操作中提取运算符。

对此案有何建议?

感谢

1 个答案:

答案 0 :(得分:0)

repsep的问题是丢弃其第二个参数的结果,您将无法识别使用了哪个运算符。 另一件事是:如果once&&upon||time||forest只能包含单词而不包含其他句子,那么您希望如何表示Sentence。在下面,我假设你的意思是这样的:

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)
        )
    )
)