使用ocamlex对字符串进行词法分析(Tiger编译器)
我试图遵循Appel的“ML中的现代编译器实现”,并使用OCAMLEX编写lexer 规范要求lexer在转换转义序列后返回字符串。 以下代码摘自ocamlex输入文件:使用ocamlex对字符串进行词法分析(Tiger编译器),ocaml,lex,tiger,ocamllex,Ocaml,Lex,Tiger,Ocamllex,我试图遵循Appel的“ML中的现代编译器实现”,并使用OCAMLEX编写lexer 规范要求lexer在转换转义序列后返回字符串。 以下代码摘自ocamlex输入文件: rule tiger = parse ... | '"' { let buffer = Buffer.create 1 in STRING (stringl buffer lexbuf) } and stringl buffer = parse | '"' { Buffer.con
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 }
有更好的方法吗?您可能有兴趣了解如何实现这一点(搜索
和字符串)。本质上,它与您的方法相同,没有漂亮的本地缓冲区(我发现您的代码在这一点上更好,但效率稍低),更复杂一些,因为支持更多转义,并使用转义表(char\u for\u反斜杠)分解类似规则
另外,规则“\\n”
重复了两次,我认为1
是对字符串长度的一个非常悲观的估计,我宁愿在这里使用20
(以避免不必要的调整大小)。谢谢!例子的宝库。我从未想过Ocaml编译器代码会如此清晰。@nimrodm您还应该记住,其中的一些代码非常陈旧,因此并非所有内容都反映了当前Ocaml开发的最佳实践。