web-dev-qa-db-ja.com

プログラミング言語の文法を定義する方法

ゼロから設計したい新しいプログラミング言語(命令型プログラミング言語)の文法(文脈自由)を定義する方法。

言い換えれば、新しいプログラミング言語を最初から作成したい場合、どのように進めますか。

24
Ayoub M.

一歩ずつ。

真面目な話ではありません。式と演算子から始めて、ステートメント、次に関数/クラスなどに進んでいきます。どの句読点が何に使用されているかのリストを保持します。

並列に、変数、配列、ハッシュ、数値リテラル、文字列リテラル、その他の組み込みリテラルを参照するための構文を定義します。また、並行して、データ命名モデルとスコープルールを定義します。

文法がレベル(リテラル/変数、演算子、式、ステートメント、関数など)に焦点を当てて意味があるかどうかを確認し、他のレベルの句読点やトークンが散在または追加/追加されてもあいまいさが生じないことを確認します。

最後に、すべてをEBNFで書き出し、ANTLRなどで実行します。

また、車輪の再発明をしないのが最善です。私は通常、ステートメントのブロックと関数を開始および終了するシーケンスと、基本的にCに似た、ECMAScriptに似た、Basicに似た、コマンドリストベースまたはXMLベースの数学演算子を選択することから始めます。これは多くの人を助けますこれは人々が一緒に働くことに慣れているものです。

もちろん、新しい言語の作成を放棄せず、十分にテストされ、よく使用されているC、ECMAScript、またはBasicに固執するというかなり説得力のある理由を考え出す必要があります。

私はしばしば新しい言語を定義し始めましたが、他の誰かがすでにいくつかの既存の言語のどこかに機能を実装しているのを見つけました。

目標が特定のプロジェクトの開発速度である場合、Python、Lua、SpiderMonkeyなどでプロトタイピングを行う方が、すぐに起動して実行し、ほとんどのコンパイル言語で必要な入力の量を減らしたい場合に適しています。 。

26
martinr

EBNF( Extended Backus-Naur Form )を確認する必要があります。

(つまり、文脈自由文法を書きたいと仮定します。)

9
Chris Tonkinson

これらの2冊の本を購入する必要があります 言語実装パターン:独自のドメイン固有および一般的なプログラミング言語を作成する(実用的なプログラマー) および 決定的なAntlrリファレンス:ドメイン固有言語の構築(実用的なプログラマー) ) 独自の言語、パーサー、トランスレーター、インタープリター、コンパイラーの作成を開始するために本当に必要なものがすべて揃っています。

5
user177800

文法を定義することを意味する場合は、既存の言語から始めて、その文法を変更して、目的の言語に一致させることをお勧めします。文法仕様の作成は、自分の頭の中で一連のパターンを使用して、かなり機械的な演習です。たとえば、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(*)コンパイラジェネレータでの実装にはまだ適しておらず、あいまいであるため、実装のためにマッサージする必要があることに注意してください。

MichaelScottによるProgrammingLanguage Pragmaticsは、プログラミング言語の設計の優れた入門書です。アマゾンで入手可能 ここ

2
Joel

バイソン を見てください、多分それはあなたが探しているものですか?

1
tanascius

プログラミング言語の設計を始める前に、プログラミング言語についてかなり多くのことを知る必要があります。私はお勧めします プログラミング言語:シュリラムクリシュナムルティによるアプリケーションと解釈

1
David Kanarek