gpt4 book ai didi

parsing - scalac缺少右括号错误报告,行号奇怪

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

因为我一直在学习 Scala,所以我经常想起 g++scalac 读取神秘输出时出现编译器错误.然而,今天我遇到了一些我怀疑即使在 g++ 中也不会发生的事情。宇宙。

一位 friend 给我发了一个非常简单的代码片段,其中有一个相当常见的错误:

case class Var(name: String) extends ArithExpr {
override def eval(env: Env) = env.lookup(name) match {
case Some(d) => d
case None => throw new IllegalArgumentException("Env " + env + " does not contain a binding for " + name)
}
override def exprString = name
// } // <-- MISSING THIS BRACE

完整源文件 is posted here .自 case class Var类声明缺少右大括号,您会认为编译器会告诉您该声明的左大括号(第 11 行)缺少右大括号。然而, scalac报告说它“假设”在前一个 case class 中间缺少一个右大括号声明(在第 7 行)。 (完整的错误输出包含在发布代码的底部。)

scalac如果您了解语言的内部结构,错误消息是有意义的,但我在这里完全不知所措。后面的类声明中缺少的右大括号如何最终传播到文件前面已经成功解析的类定义?

你到底是如何向 Scala 初学者解释这个的?不使用右大括号正是 Scala 新手可能经常犯的那种错误,但这里的错误消息似乎会使用户误入歧途,以至于报告类似 error: you seem to be missing a '}' somewhere 的内容可能会更有帮助。反而。

注意:我知道对此类问题的通常回答只是“使用 IDE,增量编译将立即标记它”或“语法突出显示应该使此错误明显”—但我的问题是专门询问 scalac输出,所以请记住,我知道这些都是有效的点,但我真的只是想了解这里的编译器发生了什么。

更新:

让我尝试一种不同的方法来解释我的困惑。该错误源于缺少右大括号,因此这显然是大括号嵌套的问题。将我发布的代码片段中的文本(代码)转换为一系列行号+大括号对,我们得到:
1{ 4}
6{ 9}
11{ 12{ 15}
19{ 22}
24{ 26}
28{ 33}

我们显然缺少一个右括号。我能看懂 scalac猜测缺少的大括号可能出现在以下任何一个位置(每个位置都由 x 表示):
1{ 4}
6{ 9}
11{ x 12{ x 15} x <-- HERE OR HERE OR HERE
19{ x 22} x <-- OR HERE OR HERE
24{ x 26} x <-- OR HERE OR HERE
28{ x 33} x <-- OR HERE OR HERE

然而,这就是 scalac 的输出说:
   +----- I THINK YOU ARE MISSING A
| CLOSING BRACE RIGHT HERE!
1{ V 4}
6{ x 9}
11{ 12{ 15}
19{ 22}
24{ 26}
28{ 33}

输入的那部分已经很好地嵌套了!在那里添加另一个右括号怎么可能有意义?

编辑:我觉得我应该再次重申我的主要问题:您将如何向 Scala 新手解释此错误消息(以及如何在源代码中找到错误的根源)?

最佳答案

考虑以下示例(我故意删除了缩进):

case class Foo( i: Int ) {
case class Bar( d: Double ) {
def get = d
}

它不会编译,但有几种可能的正确代码:
case class Foo( i: Int ) {
}
case class Bar( d: Double ) {
def get = d
}

//OR

case class Foo( i: Int ) {
case class Bar( d: Double ) {
def get = d
}
}

//OR even (still won't compile but the structure is correct so the compiler will proceed with
//another error)

case class Foo( i: Int ) {
case class Bar( d: Double ) { }
def get = d
}

那么编译器应该如何猜测哪个版本是正确的呢?在这种情况下,它会选择第一个有意义的位置:
hello.scala:3: error: Missing closing brace `}' assumed here
def get = d

这对应于第三个选项。

关于parsing - scalac缺少右括号错误报告,行号奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050166/

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