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) );;
但我完全不确定整个代码是否有效....
我在互联网上找到这段代码来计算 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) );;
但我完全不确定整个代码是否有效....