当前位置:  开发笔记 > 编程语言 > 正文

据报道,简单表达式在解析器组合器中是递归的

如何解决《据报道,简单表达式在解析器组合器中是递归的》经验,为你挑选了1个好方法。

猜猜这个编译的结果是什么?

import scala.util.parsing.combinator._

object ExprParser extends JavaTokenParsers {
    lazy val literal = int  
    lazy val int = rep("0")
}

编译器说这int是递归的并要求它的类型.我的实验说,递归的核心隐藏在文字的声明中!删除它,你会看到递归消失了!



1> Seth Tisue..:

这里有关JavaTokenParsers定义所谓的东西literal.

rep("0")实际上是rep(literal("0"))(literal从隐式转换StringParser[String]).

但是literalin JavaTokenParsers会引发争论,而你的则没有.所以,你可能会认为你只会过载,而不是覆盖,并且不会有任何冲突-之间并没有相互递归intliteral.

事实上,如果你提供显式类型:

object ExprParser extends JavaTokenParsers {
  lazy val literal: Parser[List[String]] = int 
  lazy val int: Parser[List[String]] = rep("0")
}

这对编译器来说很好.

那么为什么在省略返回类型时会触发递归的显式返回类型规则?

我认为这是一个相当微妙的问题.我不确定我确切知道这里发生了什么.我在Scala语言规范中找不到涵盖它的特定语言.

我最好的猜测是,在触发显式返回类型规则时,编译器仍处于相对较早的阶段,它还没有准确地解决什么或不是重载或覆盖.还没有返回类型,它必须基于有关类型的部分信息继续进行.

但它确实知道你的定义literal涉及名称int,而你的定义int涉及名称literal,因此它认为递归和放弃.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有