2010-08-09 64 views
4

是否有任何方法可以在OCamlLex中返回多个标记?在ocamllex中返回多个标记

我正在尝试为基于缩进的语言编写词法分析器和解析器,并且我希望我的词法分析器在注意到缩进级别小于之前的值时返回多个DEDENT标记。这将允许它在多个块结束时通知解析器。

通过以下这种方法,我将能够使用INDENTDEDENT作为直接替代了BEGINEND,因为这两个标记将由INDENTDEDENT令牌暗示。

回答

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 

或者你也可以在整个文档运行词法分析器,然后运行完全令牌流的解析器。

顺便说一句,你看到ocaml+twt

+0

谢谢,我会尽快给你一个尝试,看看我能否为我做这件事。这可能有点烦人,因为DEDENT令牌是唯一可以多次出现的令牌,但我可以解决这个问题。 – 2010-08-09 07:36:30