标准ML字符串到列表

时间:2014-03-01 21:02:35

标签: string list standards sml ml

在ML中是否有一种方法可以接受一个字符串并输出一个字符串列表,其中分隔是空格,换行符或eof,但也保持字符串内的字符串不变?

EX)你好世界“我的身份”是5555

- > [你好,世界,我的身份,是,5555]

我正在努力将这些标记化为:

- > [word,word,string,word,int]

2 个答案:

答案 0 :(得分:2)

当然可以!这是个主意:

如果我们采用类似"Hello World, \"my id\" is 5555"的字符串,我们可以将其拆分为引号,暂时忽略空格。这给了我们["Hello World, ", "my id", " is 5555"]。这里需要注意的重要一点是该列表包含三个元素 - 一个奇数。只要字符串只包含引号对(如果它的格式正确就会如此),当我们在引号处分割时,我们总会得到奇数个元素。

第二个重要的事情是列表中所有偶数元素都是不带引号的字符串(如果我们从0开始计数),并且引用了奇数编号的元素。这意味着我们需要做的只是将未引用的那些标记化,然后我们就完成了!

我把一些代码放在一起 - 你可以从那里继续:

fun foo s =
let
  val quoteSep = String.tokens (fn c => c = #"\"") s

  val spaceSep = String.tokens (fn c => c = #" ") (* change this to include newlines and stuff *)

  fun sepEven []  = []
    | sepEven [x] = (* there were no quotes in the string *)
    | sepEven (x::y::xs) = (* x was unquoted, y was quoted *)
in
  if length quoteSep mod 2 = 0
  then (* there was an uneven number of quote marks - something is wrong! *)
  else (* call sepEven *)
end

答案 1 :(得分:1)

String.tokens带你到中途。但是,如果你真的想像处理素描一样处理引号,那么就无法编写实际的词法分析器。 MLlex,它附带SML / NJ和MLton(但可用于任何SML)可能有所帮助。或者你只是手工编写,在这种情况下也应该很容易。