- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下 hello-world parboiled2 解析器:
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 只解析了输入的一部分,而忽略了它无法解析的其余部分。这是预期的行为吗?有什么方法可以强制解析器解析整个输入,如果不能解析则失败?
最佳答案
这是预期的行为。 parboiled2 是一个 PEG 解析器,如 Common Mistakes 中所述文档中的部分,它会吃掉它能找到的所有内容。
为避免此类问题,请确保您期望字符串末尾的输入结束符号:
def Expr: Rule1[Int] = rule { Sum ~ EOI }
关于scala - 如何使 parboiled2 匹配整个输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28343029/
我想创建一些辅助规则,这些规则采用一个规则并为其添加一些功能。例如,强制需要引用字符串文字,或将标记位置跟踪添加到标记规则/ADT。 我尝试了以下语法(以及相当多的排列)。 def quoted[
我正在编写一个解析器,其中一个部分应该匹配并检索双引号字符串内容 它只产生引号,而不是整个字符串。对于未引用的,一切正常 这是相应的规则: def doubleQuoted: Rule1[String
parboiled 框架中的某些类具有泛型类型参数。例如。类(class) BaseParser 。在它的文档中说: Type Parameters: V - the type of the
我使用Parboiled library创建了一个PEG对于Java。 我基于this example . 它工作正常,但现在我需要实际创建 AST。 我的问题是如何使用该库来做到这一点? 在 Goo
怎么写规则 至少 N 个字符 - 正则表达式 [a-z](2,} 最多 N 个字符 - 正则表达式 [a-z](,5} 从 N 到 M 个字符 - 正则表达式 [a-z]{3,10} 在煮沸? 最佳答
我尝试这个 Hello world 示例 ( https://github.com/neo4j/neo4j/blob/2.0.0/community/embedded-examples/src/mai
我有以下程序,它执行解析器。这是用格拉巴酒(一种半熟的 fork )开发的 package com.test; import org.parboiled.Parboiled; import org.p
我是一名优秀的程序员,十分优秀!