2

私が大学で受けている Compiler Principles コースの一環として、OCaml で実装されたコンパイラを作成しています。これは、Scheme コードを CISC のようなアセンブリ (単なる C マクロ) にコンパイルします。コンパイラの基本的な操作は次のとおりです。

  1. ファイルを読み込んでOCaml*.scmに変換しますstring
  2. 文字列を解析し、さまざまな分析を実行します。
  3. セマンティック アナライザーからの AST 出力に対してコード ジェネレーターを実行し、テキストを*.cファイルに出力します。
  4. そのファイルを GCC でコンパイルし、ターミナルで実行します。

さて、これを除いて、すべて順調です。入力ファイルを読み込もうとしています。これは約 4000 行の長さで、基本的には Scheme if&が混在した 1 つの巨大な式ですand。経由でコンパイラを実行していutopます。入力ファイルを読み取ろうとすると、すぐにスタック オーバーフロー エラー メッセージが表示されます。ファイルが大きすぎて OCaml で処理できないというのが私の最初の推測ですが、この理論を裏付けるドキュメントを見つけることができませんでした。

助言がありますか?

4

2 に答える 2

1

文字列の最大長は で与えられSys.max_string_lengthます。32 ビット システムの場合は非常に短く、16777211 です。64 ビット システムの場合は、144115188075855863 です。

32 ビット システムを使用しておらず、4000 行のファイルが 16 MB を超えていない限り、文字列の長さの制限に達しているとは思いません。

スタック オーバーフローは、文字列が長すぎる場合に予想されるものではありません。

無限再帰がある可能性が高いか、非常に深くネストされた計算がある可能性があります。

于 2016-01-24T08:20:57.450 に答える