(次の質問は OCaml 言語に関するもので、OCaml の例がありますが、質問は非常に一般的なものであり、おそらく他のコンピューター言語の正解は私の問題も解決します。したがって、この質問を好きな言語で考えてみてください。)
OCamlで任意のプログラムを文字列として取り、そのプログラムが正しいか正しくないか、後者の場合は最後に適切な文字を連結することで正しいプログラムにできるかどうかを判断する関数を書きたい.
どこかにその言語のコンパイラがあり、それを適用して、「コンパイルする」または「コンパイルしない -- 行 X、文字 Y でエラーが発生しました」という応答を得ることができると想定しています (ほとんどの場合と同様)。とにかく言語)。要約すると、プログラムを受け取って返す関数が必要です。
- 正しい-- 文字列に正しいプログラムが含まれている場合。
- Erroneous -- 文字列に誤ったプログラムが含まれている場合、どのように文字を連結しても正しいプログラムにはなりません。
- Incomplete -- 文字列にエラーではない不正なプログラムが含まれている場合。
たとえば、OCaml プログラムは使用時に定義されていないlet x = f
ため、正しくありません。f
f の後に書くものは常に、以前に定義されていない識別子になるため、それを続けることはできません。プログラムlet x =
も正しくありません。しかし、拡張するとlet x = 5
、完全に有効なプログラムになります。したがって、私の関数は最初のケースでは Erroneous を返し、2 番目のケースでは Incomplete を返す必要があります。
私たちがプログラムを持っていると、物事はトリッキーになるかもしれません
let ans = 5
let x = a
私の関数は、プログラムを続行するとns
プログラムが正しくなることを確認する必要があるためです。
私の質問は: そのような関数/アルゴリズムを書くことは可能だと思いますか? もしそうなら、一般的な考えは何ですか?そうでない場合は、そうではないことを私に納得させてください。
(たとえば、不完全であることを暗示するものなど、洞察や部分的な回答に満足しています。たとえば、言語コンパイラが 3 行目にエラーがあり、プログラムに 100 行ある場合、続行は不可能であると私は信じています。プログラムの。)