5

我的 OCaml .ml 代码如下所示:

open Str

let idregex = Str.regexp ['a'-'z' 'A'-'Z']+ ['a'-'z' 'A'-'Z' '0'-'9' '_']*;

let evalT (x,y) = (match x with 
    Str.regexp "Id(" (idregex as var) ")" -> (x,y)

为什么上面的代码不起作用?我怎样才能让它工作?

编辑:

我不需要做很多解析。所以,我希望它保留在 OCaml .ml 文件中,而不是 OCamllex 文件中

4

2 回答 2

7

match关键字适用于 OCaml 模式。正则表达式不是 OCaml 模式,它是一种不同的模式,所以你不要使用match它们。

在与功能相同的Str模块regexp中是匹配的功能。

如果你有很多正则表达式匹配要做,你可以使用ocamllex,它读取一个与你的(不幸的是无效的)定义相似的定义文件idregex,并生成 OCaml 代码来进行匹配。

这是一个会话,展示了如何使用该Str模块对您的模式进行简单匹配。

$ ocaml
        OCaml version 4.01.0

# #load "str.cma";;
# let idregex = Str.regexp "[a-zA-Z]+[a-zA-Z0-9_]*";;
val idregex : Str.regexp = <abstr>
# Str.string_match idregex "a_32" 0;;
- : bool = true
# Str.string_match idregex "32" 0;;
- : bool = false

作为旁注,您的代码看起来并不像 OCaml。它看起来像是 OCaml 和 ocamllex 的混合体。实际上有一个有点像这样的系统,叫做micmatch。看来您正计划使用常用的 OCaml 语言(我对此表示赞赏),但在某些时候查看 micmatch 可能会很有趣。

于 2014-08-09T18:28:45.167 回答
0

以下工作是否有效并做你想做的事?

open Str

let evalT (x, y) =
  let idexp = "[a-zA-Z]+ [a-zA-Z0-9_]*" in
  let full_idexp = "^Id(" ^ idexp ^ ")$" in
  let id_match x = string_match (regexp full_idexp) x 0 in
  if id_match x then Some (x, y) else None;;

我是 OCaml 菜鸟,但你的代码看起来一点也不像 OCaml。我看到您的问题已经很老了,但是在某些搜索中仍然足够高,所以我认为如果不是 OP,它可能会对其他人有所帮助。

于 2018-11-27T21:40:36.467 回答