Вернуть несколько токенов в ocamllex - PullRequest
6 голосов
/ 09 августа 2010

Есть ли способ вернуть несколько токенов в OCamlLex?

Я пытаюсь написать лексер и синтаксический анализатор для языка, основанного на отступах, и я бы хотел, чтобы мой лексер возвращал несколько токенов DEDENT, когда заметил, что уровень отступа меньше, чем был раньше.Это позволит ему уведомлять парсер о завершении нескольких блоков.

Следуя этому методу, я смогу использовать INDENT и DEDENT в качестве вставных замен для BEGIN и * 1009.*, поскольку эти два токена будут подразумеваться токенами INDENT и DEDENT.

1 Ответ

7 голосов
/ 09 августа 2010

Возвращает список токенов. Если синтаксический анализатор не может обработать это (скажем, ocamlyacc) - просто вставьте кеш между ними:

let cache =
  let l = ref [] in
  fun lexbuf ->
    match !l with
    | x::xs -> l := xs; x
    | [] -> match Lexer.tokens lexbuf with
            | [] -> failwith "oops"
            | x::xs -> l := xs; x

Или вы можете запустить лексер для полного документа, а затем запустить анализатор для полного потока токенов.

Кстати, вы видели ocaml + twt ?

...