OCaml实现逆波兰表示法求值添加异常处理时编译报错求助
问题排查与修复
错误原因
你的错误属于语法结构误判:你编写的aux函数用function关键字做模式匹配,第一个匹配分支是空列表[]的逻辑,该分支内的try ... with代码块没有正确闭合,导致后续本应和[]平级的Nombre a :: q、Op_unaire f :: q等模式匹配分支,被OCaml编译器识别为with后的异常匹配分支。异常匹配的分支要求模式类型必须是exn,而你写的列表模式自然会触发类型不匹配的报错。
修复后的完整代码
只要把空列表分支的try ... with逻辑用括号闭合,让后续分支回归function的模式匹配层级即可:
open Stack type lexeme = | Nombre of float | Op_binaire of (float -> float -> float) | Op_unaire of (float -> float) exception Syntax_Error let evalue lst = let pile = create () in let rec aux = function | [] -> let rep = pop pile in (* 校验栈中是否仅剩余一个结果元素 *) (try pop pile; raise Syntax_Error with Empty -> rep) | Nombre a :: q -> push a pile; aux q | Op_unaire f :: q -> let a = pop pile in push (f a) pile; aux q | Op_binaire f :: q -> let a = pop pile in let b = pop pile in (* 注意栈弹出顺序:先弹出的是右操作数,后弹出的是左操作数,需调整参数顺序避免运算结果错误 *) push (f b a) pile; aux q in try aux lst with | Empty -> raise Syntax_Error
额外说明
你提到的Caml Light可以运行,是因为早期Caml Light的语法缩进规则更宽松,对代码块边界的识别和现代OCaml存在差异,并不是功能特性不兼容。
内容的提问来源于stack exchange,提问作者Mathismathis
相关产品推荐
相关产品推荐

