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

scala – 如何忽略解析器组合器中的单行注释

发布时间:2020-12-16 09:54:37 所属栏目:安全 来源:网络整理
导读:我有一个工作的解析器,但我刚刚意识到我不满足于评论.在我解析的DSL中,评论以a开头;字符.如果一个 ;如果遇到,则忽略该行的其余部分(不是全部,除非第一个字符是;). 我正在为我的解析器扩展RegexParsers并忽略空格(默认方式),所以无论如何我都会丢失新的行字符
我有一个工作的解析器,但我刚刚意识到我不满足于评论.在我解析的DSL中,评论以a开头;字符.如果一个 ;如果遇到,则忽略该行的其余部分(不是全部,除非第一个字符是;).

我正在为我的解析器扩展RegexParsers并忽略空格(默认方式),所以无论如何我都会丢失新的行字符.我不希望修改我必须满足注释可能性的每个解析器,因为语句可以跨越多行(因此每个语句的每个部分可能以注释结束).是否有任何干净的方法来实现这一目标?

解决方法

可能影响您选择的一件事是您是否可以在有效的解析器中找到注释.例如,假设你有类似的东西:

val p = "(" ~> "[a-z]*".r <~ ")"

这将解析类似(abc)的东西,但由于评论你可能会遇到类似的东西:

( ; comment goes here
  abc
)

然后我建议使用TokenParser或其子类之一.这是更多的工作,因为你必须提供一个词法解析器,它将执行第一次传递以丢弃注释.但是如果你有嵌套的评论或者如果有的话,它也会更灵活;可以逃脱或如果;可以在字符串文字内,如:

abc = "; don't ignore this" ; ignore this

另一方面,您也可以尝试覆盖whitespace的值

override protected val whiteSpace = """(s|;.*)+""".r

或类似的规定.
例如,使用RegexParsers scaladoc中的示例:

import scala.util.parsing.combinator.RegexParsers

object so1 {
  Calculator("""(1 + ; foo
  (1 + 2))
  ; bar""")
}

object Calculator extends RegexParsers {
  override protected val whiteSpace = """(s|;.*)+""".r
  def number: Parser[Double] = """d+(.d*)?""".r ^^ { _.toDouble }
  def factor: Parser[Double] = number | "(" ~> expr <~ ")"
  def term: Parser[Double] = factor ~ rep("*" ~ factor | "/" ~ factor) ^^ {
    case number ~ list => (number /: list) {
      case (x,"*" ~ y) => x * y
      case (x,"/" ~ y) => x / y
    }
  }
  def expr: Parser[Double] = term ~ rep("+" ~ log(term)("Plus term") | "-" ~ log(term)("Minus term")) ^^ {
    case number ~ list => list.foldLeft(number) { // same as before,using alternate name for /:
      case (x,"+" ~ y) => x + y
      case (x,"-" ~ y) => x - y
    }
  }
  def apply(input: String): Double = parseAll(expr,input) match {
    case Success(result,_) => result
    case failure: NoSuccess => scala.sys.error(failure.msg)
  }
}

这打印:

Plus term --> [2.9] parsed: 2.0
Plus term --> [2.10] parsed: 3.0
res0: Double = 4.0

(编辑:李大同)

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

    推荐文章
      热点阅读