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

 突然丶丶想你 发布于 2023-02-06 15:41

我有一个工作的解析器,但我刚刚意识到我不满足于评论.在我解析的DSL中,注释以;字符开头.如果;遇到a,则忽略该行的其余部分(但不是全部,除非第一个字符是;).

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

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

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

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

    ( ; comment goes here
      abc
    )
    

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

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

    在另一方面,你也可以尝试重写的值空格是像

    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
    

    2023-02-06 15:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有