我正试着遵循阿佩尔的“在ML中实现现代编译器”,并使用Ocamllex编写lexer。
该规范要求lexer在转换转义序列后返回字符串。以下代码是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 }有更好的办法吗?
发布于 2011-04-26 17:09:04
您可能有兴趣了解奥卡莫雷克萨斯是如何做到这一点的(搜索and string)。本质上,它与您的方法是相同的,没有很好的本地缓冲区(在这一点上我发现您的代码更好,但这有点低效率),更复杂一些,因为支持更多的转义,并且使用转义表(char_for_backslash)分解类似的规则。
另外,您已经重复了两次"\\n"规则,我认为1是对字符串长度的一个非常悲观的估计,我宁愿在这里使用20 (以避免不必要的调整大小)。
https://stackoverflow.com/questions/5793702
复制相似问题