2011-04-26 20 views
6

我試圖按照Appel的「現代編譯器在ML中的實現」,並使用Ocamllex編寫詞法分析器。使用ocamllex lexin字符串(老虎編譯器)

規範要求詞法分析器返回字符串翻譯轉義序列。 下面的代碼是從ocamllex輸入文件的摘錄:

rule tiger = parse 
... 
| '"' 
    { let buffer = Buffer.create 1 in 
     STRING (stringl buffer lexbuf) 
    } 
and stringl buffer = parse 
| '"' { Buffer.contents buffer } 
| "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf } 
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf } 
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf } 
| '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf } 
| '\\' '\\' { Buffer.add_char buffer '\\'; stringl buffer lexbuf } 
| eof { raise End_of_file } 
| _ as char { Buffer.add_char buffer char; stringl buffer lexbuf } 

有沒有更好的辦法?

回答

5

您可能有興趣查看Ocaml lexer如何操作(搜索and string)。實質上,它與你的方法相同,沒有好的本地緩衝區(我發現你的代碼更好,但效率稍低),稍微複雜一點,因爲支持更多的轉義,並且使用轉義表( char_for_backslash)來分解類似的規則。

此外,你必須規律"\\n"重複兩次,我覺得1是你的字符串長度的十分悲觀的估計,我寧願用20這裏(以避免不必要的調整大小)。

+0

謝謝!一個金礦的例子。我從來沒有想過Ocaml編譯器的代碼會如此清晰。 – nimrodm 2011-04-26 18:55:28

+1

@nimrodm你還應該記住,那裏的一些代碼是非常古老的,所以並不是所有的東西都反映了當前OCaml開發的最佳實踐。 – gasche 2011-04-26 19:01:33