ocaml - 使用 Ocamllex 对字符串进行词法分析(The Tiger Compiler)

标签 ocaml lex tiger ocamllex

我正在尝试遵循 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/

相关文章:

functional-programming - OCaml 这不是一个函数;它不能应用

functional-programming - Ocaml 模式匹配问题

ocaml - 如何在OCaml中编写库?

ocaml - 过于急切地推断 ocaml 可选函数参数

c - Bison/Yacc 语法中的无意串联

linux - 找不到-ly错误

c# - 在我的编译器(生成 IL)中编写单元测试

c - 删除 Lex/flex 中除 Number 之外的所有内容

compiler-construction - Tiger 编译器的目标架构