首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能在我的lex文件中使用模块?

为什么我不能在我的lex文件中使用模块?
EN

Stack Overflow用户
提问于 2017-10-25 21:53:08
回答 1查看 70关注 0票数 0

这就是我目前的mll文件,它运行得很好。

代码语言:javascript
运行
复制
{ type token = EOF | Word of string }

rule token = parse
    | eof { EOF }
    | ['a'-'z' 'A'-'Z']+ as word {Word(word)}
    | _ { token lexbuf }
{
    let lexbuf = Lexing.from_channel stdin in
    let wordlist = 
        let rec next l = 
            match token lexbuf with
                EOF -> l
            | Word(s) -> next (s::l)
        in next []
    in

    List.iter print_endline wordlist
}

我做ocamllex a.mll,然后做ocamlc -o a a.ml。运行./a < a.mll将打印出mll文件中存在的所有字符串,这正是我所期望的。

但是,如果我在module StringMap = Map.Make(String)调用之前添加List.iter,则会得到一个语法错误.

File "a.mll", line 17, characters 4-10:,第17行是module的行,4-10是module这个词.

我不明白为什么添加这一行会给我一个语法错误.如果我在toplevel中输入相同的代码,它就会工作得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-25 22:01:47

我假设ocamllex生成的代码在函数中结束。不能在函数中声明全局样式的模块。

但是,您可以像这样声明一个本地模块:

代码语言:javascript
运行
复制
let module StringMap = Map.Make(String) in ...

示例:

代码语言:javascript
运行
复制
# let fgm () =
      module StringMap = Map.Make(String)
      StringMap.cardinal StringMap.empty;;
Error: Syntax error
# let flm () =
      let module StringMap = Map.Make(String) in
      StringMap.cardinal StringMap.empty;;
val flm : unit -> int = <fun>
# flm ();;
- : int = 0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46942644

复制
相关文章

相似问题

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