gpt4 book ai didi

scala - 有没有办法将上下文信息传递给解析器?

转载 作者:行者123 更新时间:2023-12-04 08:52:28 25 4
gpt4 key购买 nike

我正在解析一个小的声明性语言,在其中你可以在一个范围内声明变量(带类型),然后,就像在大多数其他语言中一样,使用名称(不带类型)。

变量的声明如下所示:

?varname
?varname1 ?varname2 - type1
?varname3 ?varname4 ?varname5 - type2

如果省略类型,则默认类型应为 object ,就像在第一种情况下一样。
因此,为此我有一个特定的解析器,它返回我自己的域对象列表,名为 LiftedTerm (你可以假设它是一个带有变量名称和变量类型的元组,实际上里面还有一些东西,但与这个问题无关):
def typed_list_variables : Parser[List[LiftedTerm]]= typed_variables.+ ^^ { case list => list.flatten.map(variable =>
LiftedTerm(variable._1, variable._2 match {
case "object" => ObjectType
case _ => TermType(variable._2)
})) }

def typed_variables = ((variable+) ~ (("-" ~> primitive_type)?)) ^^ {
case variables ~ primitive_type =>
for (variable <- variables) yield variable -> primitive_type.getOrElse("object")
}

def variable = """\?[a-zA-Z][a-zA-Z0-9_-]*""".r
def primitive_type = """[a-zA-Z][a-zA-Z0-9_-]*""".r

所有这些工作得很好。

现在在同一个“范围”中,我必须解析引用这些变量的部分。该变量显然不会再次完整声明。所以,在上面的例子中,地方 ?varname1使用将不包括 type1 .但是,当我解析输入的其余部分时,我希望获得正确的引用 LiftedTerm对象,而不仅仅是一个字符串。

我有一些递归结构,所以我不想在顶级解析器上做这个映射。我不希望在我的 RegexParsers 中对这些进行“全局映射”。对象,因为其中大多数都是有范围的,并且只与输入的一小部分相关。

有没有办法将上下文信息传递给解析器?理想情况下,我通过了 LiftedTerm 的列表(或者更好的是从变量名 String -> LiftedTerm 映射到递归解析器调用。

(抱歉,如果这很明显,我仍然是 Scala 的新手,甚至是解析器组合器的新手)。

最佳答案

AFAIK,scala 的组合器解析器库仅限于上下文无关文法。因此,不支持您的用例。

正确的方法是扩展 scala.util.parsing.combinator.Parsers并提供定制 Parser带有您的上下文的类。比您需要定义所有组合器来处理上下文。

编辑:正如下面所指出的,解析器有一个方法 intoflatMap ,因此,当您有一个生成上下文的解析器时,您可以将它与另一个需要 monadic 样式的上下文的解析器结合使用。

关于scala - 有没有办法将上下文信息传递给解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885300/

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