在ML中是否有一种方法可以接受一个字符串并输出一个字符串列表,其中分隔是空格,换行符或eof,但也保持字符串内的字符串不变?
EX)你好世界“我的身份”是5555
- > [你好,世界,我的身份,是,5555]
我正在努力将这些标记化为:
- > [word,word,string,word,int]
答案 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)可能有所帮助。或者你只是手工编写,在这种情况下也应该很容易。