7

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

有没有更好的办法?

4

1 回答 1

5

您可能有兴趣了解Ocaml 词法分析器是如何做到这一点的(搜索and string)。本质上,它与您的方法相同,没有漂亮的本地缓冲区(我发现您的代码在这一点上更好,但效率较低),更复杂一些,因为支持更多转义,并使用转义表( char_for_backslash) 来分解类似的规则。

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

于 2011-04-26T17:09:04.143 回答