OCaml 评估函数中的语法错误

Syntax error in OCaml evaluation function

我在互联网上找到这段代码来计算 OCaml 中的表达式,并想尝试了解它是如何工作的,但是当我在我的编辑器中输入它并 运行 它时,我收到以下错误:

type t =
| Integer of int
| Binary of binary * t * t
and binary =
| Add
| Sub
| Mult
| Div

type token =
| INTEGER of int
| ADD
| SUB
| MULT
| DIV
let rec eval = function
| Integer(k) -> k
| Binary(op, a, b) ->
(match op with
| Add -> ( + )
| Sub -> ( - ) 
| Mult -> ( * )
| Div -> ( / )) (eval a) (eval b)

let lexer s =
let open Str in
let split s =
let rec splitchar x l =
if x< 0 then l else splitchar (x-1) ( s.[x]:: l ) in
splitchar ( String.length s -1) [] 
|> List.map
(function
| "+" -> ADD
| "-" -> SUB
| "*" -> MULT
| "/" -> DIV
| _ ->     failwith "lexer: Invalid token: %s" );;

第 280-282 个字符: | _ -> 失败 "lexer: Invalid token: %s" );; ^^ 错误:语法错误

错误消息没有太大帮助,我尝试了一些更改,但只会让事情变得更糟。谁能帮我找出语法错误是什么?

有几个问题:

  • 拆分已定义但未使用。
  • failwith 需要一个字符串,而不是一个格式。

对于第一个问题:你必须在 List.map:

之前使用 split
...in split s | List.map...

failwith expect a string,在当前情况下,错误是它是一个看起来更像是等待另一个字符串的格式字符串。 修复如下: - 首先抓住字符串 - 然后用它来形成 failwith

期望的最终字符串
    (function
| "+" -> ADD <br>
| "-" -> SUB <br>
| "*" -> MULT <br>
| "/" -> DIV <br>
| _ as s ->     failwith ("lexer: Invalid token: " ^ s) );;

但我完全不确定整个代码是否有效....