2011-04-26 21 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