SML错误:语法错误:插入DOT

时间:2013-01-26 19:09:43

标签: compiler-errors syntax-error sml smlnj

当我在REPL中运行此代码时,它会抛出Error: syntax error: inserting DOT。我想知道错误信息的含义。

我已修复代码,但仍想知道该消息的含义以供将来参考。

part_dir是一个返回自定义数据类型direction的函数,其中包含可能的模式LeftRight

fun same (fs)=
    case fs of
         (f1::f2::fs') => case (part_dir(f1),part_dir(f2)) of
                               (dir1=dir2) => same (f2::fs')
                             | _           => false
        | _            => true

2 个答案:

答案 0 :(得分:4)

“语法错误:插入DOT”意味着在它抱怨的位置有一个意外的令牌,并且该点在该位置是合法的。但是,这并不意味着点是该位置唯一允许的位置,或者用点替换该标记会修复您的错误。

在大多数情况下,除了告诉您该位置存在语法错误之外,错误消息无用。您可能应该忽略“插入DOT”部分,因为它通常不会引导您朝着正确的方向前进。只需查看它所抱怨的行和列,并尝试找出语法错误。

在您的情况下,问题是dir1=dir2不是合法模式。合法模式将是数据类型的构造函数,其每个参数都包含模式,变量名称为_或模式的常量或元组。没有模式可以说“包含两个相等的元素的元组”。为此,您需要模式(dir1, dir2),然后dir1=dir2中的条件if

在你的情况下,你甚至不需要if。你可以写:

(dir1, dir2) => dir1 = dir2 andalso same (f2 :: fs)

答案 1 :(得分:1)

另请注意,您的两个案例表达式无法按预期运行。外壳的最后一次模式匹配实际上是内壳的一部分。换句话说,你的代码实际上具有这个含义

fun same (fs)=
    case fs of
      (f1::f2::fs') => case (part_dir(f1),part_dir(f2)) of
                         (dir1=dir2) => same (f2::fs')
                       | _           => false
                       | _           => true

当修复sepp2k指出的错误并且您的代码编译时,您会注意到解释器发出警告和错误。首先是错误,内部情况的最后一次匹配是多余的,然后是外部情况具有非详尽匹配的警告。也就是说,它没有所有可能输入的情况。

因此,将括号放在case表达式周围总是一个好主意,因为如果你的函数same在这种情况下有其他匹配,那么同样的情况就会发生。原因是管道是通用语法,其中匹配多个模式。

使用添加的括号,您的函数将获得预期的含义

fun same (fs)=
    case fs of
      (f1::f2::fs') => (case (part_dir(f1),part_dir(f2)) of
                         (dir1=dir2) => same (f2::fs')
                       | _           => false)
    | _             => true