Ocamllex 补充处理程序示例

标签 ocaml ocamllex

Chapter 12 Lexer and parser generators ,我无法编译以下示例:

{

type token = EOL | INT of int | PLUS

module Make (M : sig
               type 'a t
               val return: 'a -> 'a t
               val bind: 'a t -> ('a -> 'b t) -> 'b t
               val fail : string -> 'a t

               (* Set up lexbuf *)
               val on_refill : Lexing.lexbuf -> unit t
             end)
= struct

let refill_handler k lexbuf arg =
    M.bind (M.on_refill lexbuf) (fun () -> k lexbuf arg)

}

refill {refill_handler}

rule token = parse
| [' ' '\t']
    { token lexbuf }
| '\n'
    { M.return EOL }
| ['0'-'9']+ as i
    { M.return (INT (int_of_string i)) }
| '+'
    { M.return PLUS }
| _
    { M.fail "unexpected character" }
{
end
}

我也不明白Make模块是如何工作的,以及它来自哪里。 注意:我目前使用的是 4.02.1 ocaml 编译器。

最佳答案

此代码定义模块Make,它是一个仿函数。也就是说,它接受一个模块作为参数并返回一个模块。

它接受的模块参数是一个任意的 monad,它本质上是一种表达当你做某件事后又做其他事情时会发生什么的方式。

您可以在这里找到 monad 的描述:http://blog.enfranchisedmind.com/2007/08/a-monad-tutorial-for-ocaml

我通过将 refill 函数更改为以下内容来编译代码:

let refill_handler k lexbuf =
    M.bind (M.on_refill lexbuf) (fun () -> k lexbuf)

原始定义似乎与重新填充处理程序的类型不匹配。 (但我可能会遗漏一些东西;这种代码需要花很多时间来适应。)

关于Ocamllex 补充处理程序示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35077764/

相关文章:

debugging - CURLE_RECV_ERROR 与 PayPal API

installation - 如何在 (Arch) Linux x86_64 上安装 OCaml 核心库?

ocaml - 打印字符串的标记化

f# - fslex 中的 Lua 长字符串

ocaml - 无法输入多态 [%bs.raw 函数

polymorphism - 使 OCaml 函数对 int 列表和 float 列表具有多态性

functional-programming - 为什么当我使用 function 关键字时这个函数有弱类型? OCaml

OCamlLex 不区分大小写

OCamllex 匹配行首?