nim*_*odm 7 ocaml lex tiger ocamllex
我正在尝试遵循Appel的"ML中的现代编译器实现",并且正在使用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 }
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
您可能有兴趣了解Ocaml lexer如何做到这一点(搜索and string).本质上,它与你的方法相同,没有漂亮的本地缓冲区(我发现你的代码在这一点上更好,但效率稍差),稍微复杂一点,因为支持更多的转义,并使用转义表( char_for_backslash)来分解类似的规则.
此外,你有"\\n"两次重复的规则,我认为1你的字符串长度是一个非常悲观的估计,我宁愿20在这里使用(以避免不必要的大小调整).