Вернуть несколько токенов в 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?