2010-08-09 4 views
4

Есть ли способ вернуть несколько токенов в OCamlLex?Возврат нескольких токенов в ocamllex

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

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

ответ

6

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

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

BTW Вы видели ocaml+twt?

+0

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