2010-08-09 66 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