【发布时间】:2016-02-26 18:55:38
【问题描述】:
type unit_t = (string * int) list
我将如何创建一个表达式来将字符串解析为这种形式?我是否需要以parser.mly 格式实现代码才能处理此问题?
【问题讨论】:
type unit_t = (string * int) list
我将如何创建一个表达式来将字符串解析为这种形式?我是否需要以parser.mly 格式实现代码才能处理此问题?
【问题讨论】:
没有真正的方法可以给出详细的答案,因为您没有说明原始字符串应该如何与您的配对列表相对应。
仅基于您的输出类型的简单性,我想说您可以在不调用 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)]
【讨论】: