ゼロから設計したい新しいプログラミング言語 (命令型プログラミング言語) の文法 (コンテキストフリー) を定義する方法。
言い換えれば、新しいプログラミング言語をゼロから作成したい場合、どのように進めますか。
ゼロから設計したい新しいプログラミング言語 (命令型プログラミング言語) の文法 (コンテキストフリー) を定義する方法。
言い換えれば、新しいプログラミング言語をゼロから作成したい場合、どのように進めますか。
一歩ずつ。
真剣に、式と演算子から始めて、ステートメント、関数/クラスなどに進みます。どの句読点が何に使用されているかのリストを保持してください。
並行して、変数、配列、ハッシュ、数値リテラル、文字列リテラル、その他の組み込みリテラルを参照するための構文を定義します。また、並行して、データ命名モデルとスコープ ルールを定義します。
文法が意味を成しているかどうかを確認するには、レベル (リテラル/変数、演算子、式、ステートメント、関数など) に注目し、他のレベルからの句読点やトークンが散在または追加/前置されていてもあいまいさが生じないようにします。
最後に、すべてを EBNF に書き出し、ANTLR などで実行します。
また、車輪の再発明をしないのが最善です。私は通常、ステートメント ブロックと関数、および算術演算子を開始および終了するシーケンスを選択することから始めます。これらは通常、基本的に C に似ており、ECMAScript に似ており、Basic に似ており、コマンド リスト ベースまたは XML ベースです。これは、人々が作業に慣れているため、非常に役立ちます。
もちろん、新しい言語の作成を放棄せず、十分にテストされ、よく使用されている C、ECMAScript、または Basic に固執する、かなり説得力のある理由を考え出す必要があります。
私が新しい言語を定義し始めたのは、他の誰かが既存の言語のどこかにすでに機能を実装していることを見つけるためだけでした。
あなたの目標が特定のプロジェクトの開発速度である場合、すぐに起動して実行したい場合や、ほとんどのコンパイル済み言語で必要な入力の量を減らしたい場合は、Python、Lua、SpiderMonkey などでプロトタイプを作成する方がよい場合があります。 .
EBNF(Extended Backus-Naur Form)をご覧ください。
(つまり、文脈自由文法を書きたいと仮定します。)
文法を定義することを意味する場合は、既存の言語から始めて、目的に合わせてその文法を変更するのが最善の方法です。文法仕様の作成はかなり機械的な作業であり、自分の頭の中でパターンのセットを使用します。たとえば、if ステートメントはどのように見えますか? Cに似てる?
if <- if(exp) block
if <- if(exp) block else block2
またはMLが好きですか?
if <- if exp then block else block end
あるいは、Lua のような elseif を使いたいかもしれません:
if <- if exp then exp end
if <- if exp then exp (elseif exp)* else exp end
文法とセマンティクスは、これらの決定を成文化します。これらのどれも LALR または LL(*) コンパイラ ジェネレーターでの実装にまだ適していないことに注意してください。
Michael Scott による Programming Language Pragmatics は、プログラミング言語の設計への優れた入門書です。こちらのAmazonで購入可能です
バイソンを見てください、多分それはあなたが探しているものですか?
プログラミング言語の設計を始める前に、プログラミング言語についてかなりの知識が必要です。Shriram Krishnamurthi による Programming Languages: Application and Interpretationをお勧めします。