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 lexerがこれをどのように行うかを調べることに興味があるかもしれません( を検索してand stringください)。本質的に、それはあなたの方法と同じで、素敵なローカルバッファーがなく(この点ではあなたのコードの方が良いと思いますが、これは少し効率的ではありません)、より多くのエスケープがサポートされているため少し複雑で、エスケープテーブルを使用しています( char_for_backslash) を使用して、同様のルールを因数分解します。

また、ルールが 2 回繰り返されていますが、これは文字列の長さの非常に悲観的な見積もり"\\n"だと思います。(不必要なサイズ変更を避けるために) ここで使用したいと思います。120

于 2011-04-26T17:09:04.143 に答える