OCaml将字符串解析为字符串* Int列表

时间:2016-02-26 18:55:39

标签: parsing ocaml lexer

type unit_t = (string * int) list

我如何创建表达式来将字符串解析为此表单?我是否需要以parser.mly格式实现代码才能处理此问题?

1 个答案:

答案 0 :(得分:0)

没有真正的方法可以给出详细的答案,因为你不会说原始字符串应该如何与你的对子列表相对应。

基于输出类型的简单性,我说你可以在不调用ocamlyacc的完整机制的情况下完成这项工作。即,我怀疑你需要一个parser.mly文件。您可以使用ocamllex,也可以只应用Str模块中的一些正则表达式。这取决于你的解析实际需要做什么。

这是使用Str中的正则表达式的一种可能性:

let p s =
    let fs = Str.full_split (Str.regexp "[0-9]+") s in
    let rec go = function
    | [] -> []
    | Str.Text s :: Str.Delim i :: rest -> (s, int_of_string i) :: go rest
    | Str.Text s :: rest -> (s, 0) :: go rest
    | Str.Delim i :: rest -> ("", int_of_string i) :: go rest
    in
    go fs

您可以像这样运行:

# #load "str.cma";;
# #use "p.ml";;
val p : string -> (string * int) list = <fun>
# p "123abc456def";;
- : (string * int) list = [("", 123); ("abc", 456); ("def", 0)]
# p "ghi789jkl100";;
- : (string * int) list = [("ghi", 789); ("jkl", 100)]