parsing - Scala PacktRat 解析器将运算符限制为恰好 1

标签 parsing scala

目前我在 Scala 2.9.2 中使用 Scala PackratParsers 制作效果如下:

  lazy val andExpression: PackratParser[Expression] = equalityExpression | expression ~ "&" ~ expression ^^ {
      case x ~"&"~y => AndExpr(x,y)
    }

  lazy val orExpression: PackratParser[Expression] = andExpression | ( expression ~ "|" ~ expression ) ^^ {
      case x ~"|"~y => OrExpr(x,y)
    }

它适用于以下输入

"a & b", "a | c", "(a & b) | c"

但是,我刚刚发现我的解析器太贪婪了。

"a && b", "a &&& b", "a ||||| b"

它解析得很好。我相信我只是缺少组合器上的显式匹配器计数。 e ~ "&".{1} ~ e 到底是什么意思?如何只匹配出现的一个操作符,仅此而已?

我正在编写的解析器将表达式视为 XPath

lazy val absolutePath: PackratParser[NodePath] = "/" ~ relativePath ^^ {
    case "/" ~ rel => NodePath( rel.nodeExpr, true );

  }  

  lazy val relativePath: PackratParser[NodePath] = repsep( nodeExpression , "/" ) ^^ {
    case x => 
        if ( debug) printf("x=%s NodePath\n",x ); 
        NodePath( x , false )

你是对的。

   lazy val nodeExpression: PackratParser[Token] = qname | variable | step 

   lazy val expression = orExpression | nodeExpression | variable | literal | function | ...

既然你可以有空的 NodePath( List[QName]() ) 那么“是的!”表达式为空,因此“x &”和“& x”被成功解析。因此我的解析器显得贪婪。

让我重新表述一下问题,如何确保 relativeExpression 至少包含一个 QName

本质上,字符串集 ( "x", "/x", "x/y", "/x/y", ... ) 应该是有效的 XPath 类似表达式,但是不是""? ;-)

最佳答案

"&""|" 仅匹配单个字符。我能想到的唯一解释是 表达式 可以为空,也可以是 &| 本身。

关于parsing - Scala PacktRat 解析器将运算符限制为恰好 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11652317/

相关文章:

scala - Akka Streams TCP 套接字客户端终止

regex - 为基于 Web 的邮件列表存档编码 Gmail 样式 "hide quoted text"

powershell - Powershell使用split只返回第n个元素

c - scanf 的多种输入格式

oracle - 使用 Spark 1.6.2 JDBC 读取 Oracle 数据的并行性

json - GATLING JSON 保存和重用

c++ - 如何使用cpprestsdk解析来自websocket_client的json数据

C++ 将地址列表存储到数组以解析原始非终止文本?

linux - sbt 下载启动器失败

scala - 如何在 Scala 中测试 future 列表