Вернуть несколько токенов в ocamllex

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

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

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

1 ответ

Решение

Вернуть список токенов. Если парсер не может обработать это (скажем, 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?

Другие вопросы по тегам