Skip to content

Instantly share code, notes, and snippets.

@itsuart
Created December 3, 2010 05:01

Revisions

  1. itsuart created this gist Dec 3, 2010.
    14 changes: 14 additions & 0 deletions gistfile1.fs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,14 @@
    (*
    На входе список токенов, задача - объединить подпоследовательности вида "String, '_', String" и "'-', Number" в одну, т.е.
    Вход: ["foo", '_', "bar", '-', 12, "some", "other", 15, "baz"]
    Выход: ["foo_bar", -12, "some", "other", 15, "baz"]
    *)
    let pack_tokens tokens =
    let accum = ref [] in
    let rec pack tokens_left = match tokens_left with
    [] -> List.rev !accum
    | Tokenizer.String l :: Tokenizer.Symbol '_' :: Tokenizer.String r :: tail ->
    pack (Tokenizer.String (String.concat "_" [l;r]) :: tail)
    | Tokenizer.Symbol '-' :: Tokenizer.Number n :: tail -> pack (Tokenizer.Number (-n) :: tail)
    | h :: tail -> accum := h :: !accum; pack tail
    in pack tokens