SML/NJ中main函数触发语法错误 原因排查与修复指导
SML/NJ成绩统计程序main函数语法错误说明
你遇到的deleting DO VAL、deleting VAL ID、SEMICOLON ID、deleting SEMICOLON END SEMICOLON类报错,都是解析器遇到不符合SML语法规则的代码时,尝试自动纠错恢复解析打出的日志,不需要按照报错字面意思删DO/VAL这类关键字,核心错误都在main函数的写法不符合SML的语法规则,具体问题如下:
- 不存在
var声明关键字:SML中默认绑定是不可变的,没有命令式语言的var变量声明语法。如果需要可修改的循环计数器,必须用ref声明可变引用,修改值用:=操作符,读取值用!操作符,直接写i = i + 1的写法在SML里是布尔判断表达式,不是赋值操作。 - 列表下标访问语法错误:SML不支持
列表名[索引]的下标访问写法,取列表第n位元素需要用标准库函数List.nth(列表, 索引),索引从0开始计数。 - while循环结构语法错误:SML中
while 条件 do后只能接单个表达式,要顺序执行多条逻辑必须用括号把所有逻辑包裹,表达式之间用;分隔,不需要额外写end标记结束while块,你代码里while块末尾和main函数末尾多写了两个多余的end。 print函数参数不符合要求:SML的print函数只接收单个字符串类型参数,不能直接传入整数、实数、字符串混合的多参数,需要先用对应类型转换函数(Int.toString转整数、Real.toString转实数)把所有值转成字符串,再用字符串拼接符^拼成单个字符串后传入打印。
修正后可运行的完整代码
val IDs = [410021001,410021002,410021003,410021004,410021005,410021006,410021007,410021008,410021009,410021010]; val Names = ["Alan","Bob","Carrie","David","Ethan","Frank","Gary","Helen","Igor","Jeff"]: string list; val HW1 = [90.0,85.0,90.0,117.0,85.0,90.0,117.0,117.0,117.0,117.0] : real list; val HW2 = [84.5,49.0,110.5,85.0,56.0,65.0,65.0,59.5,50.0,50.0] : real list; val HW3 = [117.0,117.0,117.0,0.0,65.0,117.0,50.0,51.0,75.0,75.0] : real list; val Midterm = [60.0,57.0,6.0,44.0,72.0,43.0,54.0,75.0,53.0,75.0] : real list; val Final = [66.0,64.0,62.0,55.0,66.0,75.0,75.0,75.0,75.0,75.0] : real list; fun score(HW1, HW2, HW3, Midterm, Final) = round(HW1 * 0.1 + HW2 * 0.1 + HW3 * 0.1 + Midterm * 0.3 + Final * 0.4); fun letterGrade(score) = if score >= 90 then "A+" else if score >= 85 then "A" else if score >= 80 then "A-" else if score >= 77 then "B+" else if score >= 73 then "B" else if score >= 70 then "B-" else if score >= 67 then "C+" else if score >= 63 then "C" else if score >= 60 then "C-" else if score >= 50 then "D" else "E"; val i = ref 0 val max = length(IDs) fun main() = while !i < max do ( let val current_hw1 = List.nth(HW1, !i) val current_hw2 = List.nth(HW2, !i) val current_hw3 = List.nth(HW3, !i) val current_mid = List.nth(Midterm, !i) val current_final = List.nth(Final, !i) val ind_score = score(current_hw1, current_hw2, current_hw3, current_mid, current_final) val grade = letterGrade(ind_score) in print(Int.toString(List.nth(IDs, !i)) ^ " " ^ List.nth(Names, !i) ^ " " ^ Int.toString(ind_score) ^ " " ^ grade ^ "\n"); i := !i + 1 end )
代码加载到SML/NJ后,执行main();即可运行打印所有学生的成绩结果。
内容的提问来源于stack exchange,提问作者Sifiso Lucolo Dhlamini
相关产品推荐
相关产品推荐

