首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocamllex填充处理程序示例

Ocamllex填充处理程序示例
EN

Stack Overflow用户
提问于 2016-01-29 05:51:11
回答 1查看 129关注 0票数 2

第12章词汇和解析器生成器中,我无法编译以下示例:

代码语言:javascript
复制
{

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编译器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 07:04:11

这段代码定义了模块Make,它是一个函子。也就是说,它以一个模块作为参数并返回一个模块。

它接受的模块参数是一个任意的monad,它本质上是一种用来表示当您做某事时会发生什么的一种方式,然后是其他一些事情。

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

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

代码语言:javascript
复制
let refill_handler k lexbuf =
    M.bind (M.on_refill lexbuf) (fun () -> k lexbuf)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35077764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档