【问题标题】:A tutorial on Lexical parser词法解析器教程
【发布时间】:2016-01-03 21:21:47
【问题描述】:

我有点卡在空格上的解析器组合器上。即使关键字是“keywordandthererestofthestream”中的前缀,它们也会使用关键字。此外,identifier = rep1("a")a a 中的两个字母作为单个aa 使用。这些信息表明我需要进行一些词法分析,并且可以将解析器组合器堆叠在词法分析器的顶部。

我看到有一个特殊的Lexical 解析器来服务于这个目的。但是为什么实际上这个解析器用于标记化呢?重点是什么?为什么更有优势?它的EOLwhitespace 方法有什么意义?它是否与我在RegexParsers 中看到的skipWhitespace 有关?此外,我找不到任何将解析器堆叠在词法分析器之上的示例。在我看来,更高级别的 RegexParsers 使用Input,这是一个字符流。怎么可能是令牌流?

顺便说一句,是否可以在其中构建位置跟踪 (line:col)?

【问题讨论】:

    标签: scala scanning parser-combinators combinators


    【解决方案1】:

    rep1RegexParsers 中将在它解析的内容之间调用skipWhitespace - 这意味着您将得到一个Seq,其中包含两个as。这在RegexParsers 中有记录。

    如果您想获取line:col 数据,请将您的解析结果类型扩展为Position,并将解析器包装在对positioned 的调用中:

    object Parser extends RegexParsers {
      case class MyType(value: String) extends Positional
      val myType: Parser[MyType] = positioned { "typey" ^^ { MyType.apply } }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2013-04-29
      相关资源
      最近更新 更多