When compilers generate errors for a specific programming language, there's distinction between syntax & semantic errors. E.g. ) + f 3
has ill-formed syntax, but type checking is considered as part of semantic analysis.
私の直感は、言語構文に制約を加えることによって、意味的なエラーのいくつかが構文エラーになる可能性があることを示しています。私の質問は、構文とセマンティクスの間に本質的な違いがある場合です。あるいは、彼らはちょうど異なるレベルで実行されているかどうかをチェックしていますか?例えば、構文チェックはローカルチェックであり、意味チェックはグローバルです。構文チェックとは異なるセマンティクスチェックを行う基本的なことはありますか?すべての意味検査を構文内に組み込むことは可能ですか?これらの質問に関連する理論はありますか?
私の直感が間違っている場合もあります - それが間違っている理由を教えてください。
最も厳密な意味では、構文エラーとセマンティクスエラーの間に言語理論が重要です:唯一の顕著な違いは、その言語を認識するために必要なオートマトンの複雑さです。
すべての「構文タスク」が単にプッシュダウンオートマトンとすべての「セマンティックタスク」を必要とするだけであれば問題は解決されますが、残念ながらPDA単独では処理できないプログラミング言語構文に関連する多くのタスクがあり、弱い計算能力しか必要としないようなセマンティックタスク。それでもなお、この区別はある程度の直感を提供する。
実用的には、コンパイラは段階的に設計されているため、実行可能なコードを管理しやすいタスクを管理できます。私はCompcertウェブサイトのこの図が特に好きです。
通常、最初の1-3フェーズは、本質的にバイトまたはトークンのストリームを、より自然にツリー構造と見なされるものに変えます。ツリーの作成前のすべてには「構文」とそれ以降はすべて「セマンティクス」と表示されます。
Cでは、構文フェーズは通常トークン化、マクロ展開および解析、それ以降はすべてセマンティクスになります。公式の区別は受け入れられていないので、意見は異なる可能性があります。
正式論理の分野では、構文的概念と意味論的概念を区別する方法について、より大きな議論が必要だと思いますが、私はそれを持つ資格があるとは確信していません。
言いにくいです。 "構文エラー"と "静的意味エラー"の境界は実際にはぼやけている可能性があります。
1つの適切な例は、同じプログラミング言語、たとえばSystem Fのカレースタイル(外部的な型付け)と教会スタイル(固有の型付け)のバリエーションです。言語の教会スタイルの変形に型名を含めることに失敗すると、 (セマンティクスのと構文の一部であるために)セマンティックエラーだけでなく、セマンティックエラーであるかどうかにかかわらず、カリースタイルバリアントに含めることはできませんシステムFは決めることができないので、これがエラーかどうかは分かりますが)、構文エラーはありません。
今では、多くの場合、静的セマンティックエラーと構文エラーの特定のクラスの間に線を引くのは難しいことがわかります。文法的に間違ったプログラムを「間違っていない」と、意味的に間違っているプログラムを「無意味」と考えることがあるかもしれませんが、ある種のトリッキーなケースがあります。構文解析(実際にはわかりませんが、理論的には可能であるはずです)または静的意味検査フェーズのいずれかで、変数の再宣言を確認できます。それは構文上の意味論的な問題か?知りません。文法と意味論の正式な記述に依存しますが、存在しない場合はすべてが非常に困難になります。