使用Ocamllex作为lexing字符串(The Tiger Compiler)

时间:2011-04-26 16:56:06

标签: 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 }

有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

您可能有兴趣了解Ocaml lexer如何执行此操作(搜索and string)。本质上,它与你的方法相同,没有漂亮的本地缓冲区(我发现你的代码在这一点上更好,但效率稍差),稍微复杂一点,因为支持更多的转义,并使用转义表( char_for_backslash)来分解类似的规则。

此外,你有两次重复规则"\\n",我认为1是对你的字符串长度非常悲观的估计,我宁愿在这里使用20(以避免不必要的大小调整)。