加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Parser,为什么不“轻拍<~pat~> pat”工作?

发布时间:2020-12-16 09:08:50 所属栏目:安全 来源:网络整理
导读:试用一个简单的解析器组合器,我遇到了编译错误. 我想解析一下 – “Smith,Joe”进入Name对象,如Name(Joe,Smith).我想这很简单. 这是与之相关的代码: import util.parsing.combinator._ class NameParser extends JavaTokenParsers { lazy val name: Parser[
试用一个简单的解析器组合器,我遇到了编译错误.

我想解析一下 – “Smith,Joe”进入Name对象,如Name(Joe,Smith).我想这很简单.

这是与之相关的代码:

import util.parsing.combinator._

    class NameParser extends JavaTokenParsers {
      lazy val name: Parser[Name] = 
        lastName <~ "," ~> firstName ^^ {case (l ~ f) => Name(f,l)}
      lazy val lastName = stringLiteral
      lazy val firstName = stringLiteral
    }

    case class Name(firstName:String,lastName: String)

我正在测试它

object NameParserTest {
  def main(args: Array[String]) {
    val parser = new NameParser()
    println(parser.parseAll(parser.name,"Schmo,Joe"))
  }
}

获取编译错误:

error: constructor cannot be instantiated to expected type;
found   : NameParser.this.~[a,b]
required: java.lang.String
lazy val name: Parser[Name] = lastName <~ ",l)}

我在这里失踪的是什么?

解决方法

在这一行:

lazy val name: Parser[Name] = 
    lastName <~ ",l)}

你不想同时使用<?和?>.您正在创建一个与“,”和firstName匹配并仅保留“,”的解析器,然后您将创建一个与lastName和先前解析器匹配的解析器,并仅保留lastName.

您可以将其替换为:

(lastName <~ ",") ~ firstName ^^ {case (l ~ f) => Name(f,l)}

但是,虽然这将按照您想要的方式进行编译和组合,但它不会解析您想要的内容.我尝试时得到了这个输出:

[1.1] failure: string matching regex `"([^"p{Cntrl}]|[/bfnrt]|u[a-fA-F0-9]{4})*"' expected but `S' found

Schmo,Joe
^

stringLiteral需要在代码中看起来像字符串文字的东西(引号中的东西). (JavaTokenParsers旨在解析看起来像Java的东西.)这有效:

scala> val x = new NameParser
x: NameParser = NameParser@1ea8dbd

scala> x.parseAll(x.name,""Schmo","Joe"")
res0: x.ParseResult[Name] = [1.15] parsed: Name("Joe","Schmo")

您应该用一个正则表达式替换它,该正则表达式指定您将接受名称的字符串类型.如果你查看文档here,你会看到:

implicit def regex (r: Regex) : Parser[String]

A parser that matches a regex string

所以你可以在那里放一个Regex对象,它将被转换成一个匹配它的解析器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读