type unit_t = (string * int) list
我如何创建表达式来将字符串解析为此表单?我是否需要以parser.mly
格式实现代码才能处理此问题?
答案 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)]