【问题标题】:Having some simple problems with Scala combinator parsersScala 组合器解析器有一些简单的问题
【发布时间】:2011-08-30 09:25:52
【问题描述】:

一、代码:

package com.digitaldoodles.markup

import scala.util.parsing.combinator.{Parsers, RegexParsers}
import com.digitaldoodles.rex._


class MarkupParser extends RegexParsers {
    val stopTokens = (Lit("{{") | "}}" | ";;" | ",,").lookahead
    val name: Parser[String] = """[@#!$]?[a-zA-Z][a-zA-Z0-9]*""".r
    val content: Parser[String] = (patterns.CharAny ** 0 & stopTokens).regex
    val function: Parser[Any] = name ~ repsep(content, "::") <~ ";;"
    val block1: Parser[Any] = "{{" ~> function
    val block2: Parser[Any] = "{{" ~> function <~ "}}"
    val lst: Parser[Any] = repsep("[a-z]", ",") 
}

object ParseExpr extends MarkupParser {
    def main(args: Array[String]) {
        println("Content regex is ", (patterns.CharAny ** 0 & stopTokens).regex)
        println(parseAll(block1, "{{@name 3:4:foo;;"))
        println(parseAll(block2, "{{@name 3:4:foo;; stuff}}"))
        println(parseAll(lst, "a,b,c")) 
    }
}

那么,运行结果:

[info] == run ==
[info] Running com.digitaldoodles.markup.ParseExpr 
(Content regex is ,(?:[\s\S]{0,})(?=(?:(?:\{\{|\}\})|;;)|\,\,))
[1.18] parsed: (@name~List(3:4:foo))
[1.24] failure: `;;' expected but `}' found

{{@name 3:4:foo;; stuff}}
                       ^

[1.1] failure: string matching regex `\z' expected but `a' found

a,b,c
^

我使用自定义库来组装我的一些正则表达式,所以我打印了“内容”正则表达式;它应该基本上是任何文本,但不包括某些令牌模式,使用积极的前瞻断言强制执行。

最后,问题:

1) 第一次在“block1”上运行成功,但不应该,因为“repsep”函数中的分隔符是“::”,而“:”被解析为分隔符。

2) 在“block2”上运行失败,大概是因为前瞻子句不起作用——但我不知道为什么会这样。 lookahead 子句已经在“block1”上运行的“repsep”中执行,并且似乎在那里工作,那么为什么它会在块 2 上失败?

3) 对“lst”的简单 repsep 练习失败,因为在内部,解析器引擎似乎正在寻找边界——这是我需要以某种方式解决的问题吗?

谢谢, 肯

【问题讨论】:

    标签: parsing scala


    【解决方案1】:

    1) 不,“::”不被解析为分隔符。如果是这样,输出将是(@name~List(3, 4, foo))

    2) 发生这种情况是因为“}}”也是一个分隔符,所以它需要最长的匹配——也包括“;;”的匹配。如果您使前面的表达式不急切,那么它将在“stuff”上的“s”处失败,我想这就是您所期望的。

    3) 您传递的是文字,而不是正则表达式。将"[a-z]"修改为"[a-z]".r就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2023-03-23
      • 2014-05-24
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多