我正在尝试遵循 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 }
有没有更好的办法?
最佳答案
您可能有兴趣查看 Ocaml lexer这样做(搜索 and string
)。本质上,它与您的方法相同,没有漂亮的本地缓冲区(我发现您的代码在这一点上更好,但效率稍低),更复杂一点,因为支持更多转义,并使用转义表( char_for_backslash) 来分解类似的规则。
此外,您还有规则 "\\n"
重复了两次,我想1
对您的字符串长度的估计非常悲观,我宁愿使用 20
此处(以避免不必要的调整大小)。
关于ocaml - 使用 Ocamllex 对字符串进行词法分析(The Tiger Compiler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793702/