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

使用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

我试图遵循Appel的“ML中的现代编译器实现”,并使用OCAMLEX编写lexer

规范要求lexer在转换转义序列后返回字符串。 以下代码摘自ocamlex输入文件:

 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开发的最佳实践。