Javascript で C (サブセット) のインタープリターを作成しています (ブラウザーでプログラムの実行を視覚化したいと考えています)。
最初のステップとして、ユーザー プログラムの AST ツリーを作成します。これには、flex/bizon の組み合わせに似た Jison を使用しています。
今のところ、プログラムをトークン化し、解析して、標準で指定された文法に準拠しているかどうかを確認します (typedef によって導入されたあいまいさの問題はそのままにしておきます)。
ただし、C 文法に準拠していても、プログラムが意味を成すとは限りません。たとえば、
int main() {
x = ("jklfds" || "jklgfd")(2, imlost);
}
x は宣言されていませんが、文法に準拠しています ("jklfds" || "jklgfd") は関数ポインターではありません - 型はチェックされません。一般に、チェックされていない多くのコンテキスト条件があります。
ASTツリーを構築する際にどこまでチェックすればよいか悩んでいます。たとえば、この時点で理論的には、定数式を完全に計算して確認するのは簡単です。ただし、他のチェックの多くにはコンテキストが必要です。たとえば、解析中に、一部の識別子がプログラムで以前に宣言された構造体を参照していることを知ることは可能ですか?
ASTツリーをそのまま構築し、ASTを複数回分析/変換してコンテキストの制約をチェックし、ますます多くの条件が正しいことを証明するのはどうですか? 解析中のチェックよりも簡単/難しいでしょうか?
私は最も友好的な解決策を探しています。その速度は気にしません。