gpt4 book ai didi

使用 scala 解析器组合器解析基于缩进的语言

转载 作者:行者123 更新时间:2023-12-02 14:21:39 25 4
gpt4 key购买 nike

有没有一种方便的方法来使用 Scala 的解析器组合器来解析缩进很重要的语言? (例如Python)

最佳答案

假设我们有一种非常简单的语言,这是一个有效的程序

block
inside
the
block

我们希望将其解析为 List[String], block 内的每一行都作为一个 String

我们首先定义一个方法,该方法采用最小缩进级别并返回具有该缩进级别的行的解析器。

def line(minIndent:Int):Parser[String] = 
repN(minIndent + 1,"\\s".r) ~ ".*".r ^^ {case s ~ r => s.mkString + r}

然后,我们通过在行之间使用合适的分隔符重复行解析器来定义具有最小缩进级别的 block 。

def lines(minIndent:Int):Parser[List[String]] =
rep1sep(line(minIndent), "[\n\r]|(\n\r)".r)

现在我们可以为我们的小语言定义一个解析器,如下所示:

val block:Parser[List[String]] =
(("\\s*".r <~ "block\\n".r) ^^ { _.size }) >> lines

它首先确定当前的缩进级别,然后将其作为最小值传递给行解析器。让我们测试一下:

val s =
"""block
inside
the
block
outside
the
block"""

println(block(new CharSequenceReader(s)))

我们得到

[4.10] parsed: List(    inside,     the,     block)

为了编译所有这些,您需要这些导入

import scala.util.parsing.combinator.RegexParsers
import scala.util.parsing.input.CharSequenceReader

并且您需要将所有内容放入一个扩展 RegexParsers 的对象中,如下所示

object MyParsers extends RegexParsers {
override def skipWhitespace = false
....

关于使用 scala 解析器组合器解析基于缩进的语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com