使用Ocamllex进行字符串词法分析(Tiger编译器)

7
我将尝试跟随Appel的《现代编译器实现》一书,使用Ocamllex编写词法分析器。规范要求词法分析器在翻译转义序列后返回字符串。以下代码是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 }

有更好的方法吗?

1个回答

5
您可能会对查看Ocaml词法分析器是如何实现这一点感兴趣(搜索and string)。本质上,它与您的方法相同,没有很好的本地缓冲区(我发现您在这一点上的代码更好,但这稍微不太高效),更加复杂,因为支持了更多的转义,并使用转义表(char_for_backslash)来归纳类似的规则。
此外,您有两个重复的规则"\\n",而我认为1是您字符串长度的一个非常悲观的估计值,在这里我宁愿使用20(以避免不必要的调整大小)。

谢谢!这里有很多宝贵的例子。我从来没有想过Ocaml编译器的代码会如此清晰。 - nimrodm
1
@nimrodm 你也应该记住,那里的一些代码相当古老,因此并非所有内容都反映了OCaml开发的当前最佳实践。 - gasche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接