首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使parboiled2与整个输入匹配?

如何使parboiled2与整个输入匹配?
EN

Stack Overflow用户
提问于 2015-02-05 11:41:44
回答 2查看 445关注 0票数 3

我编写了以下hello-world parboiled2解析器:

代码语言:javascript
复制
class MyParser(val input: ParserInput) extends Parser {

 /*
  Expr     <- Sum
  Sum      <- Product ('+') Product)*
  Product  <- Value (('*') Value)*
  Value    <- Constant | '(' Expr ')'
  Constant <- [0-9]+
  */

  def Expr: Rule1[Int] = rule { Sum }

  def Sum: Rule1[Int] = rule { oneOrMore(Product).separatedBy(" + ") ~> ((products: Seq[Int]) => products.sum) }

  def Product: Rule1[Int] = rule { oneOrMore(Value).separatedBy(" * ") ~> ((values: Seq[Int]) => values.product) }

  def Value: Rule1[Int] = rule { Constant | ('(' ~ Expr ~ ')') }

  def Constant: Rule1[Int] = rule { capture(oneOrMore(Digit)) ~> ((digits: String) => digits.toInt) }

}

这在很大程度上符合预期,例如,它成功地将"1 + 2“解析为3。

如果我给它一个无效的输入,比如"1 + (2“),我会期望解析失败。但它实际上是成功的,结果是1。

看起来,parboiled2只是在解析输入的一部分,而忽略了它无法解析的其余部分。这是预期的行为吗?是否有任何方法强制解析器解析整个输入,如果不能解析则失败?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-05 12:35:18

这是预期的行为。parboiled2是一个聚乙二醇解析器,正如文档中的常见错误部分所描述的那样,它会吃掉它能找到的所有东西。

要避免这样的问题,请确保在字符串末尾使用输入结束符号:

代码语言:javascript
复制
def Expr: Rule1[Int] = rule { Sum ~ EOI }
票数 4
EN

Stack Overflow用户

发布于 2015-05-13 01:51:55

如果输入“1+(2+3*4)+5”,解析将失败。定义另一个根规则,并保留Expr原样,这将起到以下作用:

代码语言:javascript
复制
def InputLine = rule { Expr ~ EOI }
def Expr: Rule1[Int] = rule { Sum }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28343029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档