すでに1つ以上のプログラミング言語に精通している可能性があります。しかし、独自のプログラミング言語を作成する方法について考えたことがありますか?つまり:
プログラミング言語は、文字列をさまざまなマシンコード出力に変換する一連のルールです。
要するに、プログラミング言語は、事前定義されたルールのセットにすぎません。それを便利にするには、コンパイラ、通訳など、これらのルールを理解できるものが必要です。したがって、単にいくつかのルールを定義することができ、それを機能させるために、既存のプログラミング言語を使用してこれらのルールを理解できるプログラムを作成できます。
コンパイラは、コードをプロセッサが実行できるマシンコード(Cコンパイラなど)に変換します。
通訳者は、プログラムを1行ごとに通過し、各コマンドを実行します。
試してみませんか?コンソールにMagenta出力を出力する非常にシンプルなプログラミング言語を作成しましょう。私たちはそれをマゼンタと呼びます。
node.jsを使用しますが、あらゆる言語で学ぶことができ、概念は同じままです。最初にindex.jsファイルを作成してセットアップします。
クラスマゼンタ{ コンストラクター(コード){ this.codes = codes; } 走る() { console.log(this.codes); } } //現在、コードを「codes」と呼ばれる文字列変数に保存します//後で、ファイルconst codes = `print" hello world "からコードを読み取ります 「Hello Again」を印刷してください `; const magenta = new Magenta(コード); Magenta.run();
私たちがここでやっていることは、マゼンタと呼ばれるクラスを宣言することです。このクラスは、コード変数を介して提供するテキストを使用して、コンソールにテキストを記録する責任のあるオブジェクトを定義および初期化します。また、現在、ファイル内のいくつかの「ハロー」メッセージを使用して、コード変数を直接定義しています。
さて、いわゆる語彙分析装置を作成する必要があります。
わかりました、最初に英語について話しましょう。次のフレーズをご覧ください。
大丈夫ですか?
ここで、「Hello」は挨拶です」、「補足的な口調」、「あなた」は個人的な代名詞です。最後に疑問符( "?")があります。任意の文やフレーズをこのような多くの文法コンポーネントに分けることができます。これらの部分を区別する別の方法は、それらを小さなマークに分割することです。テキストをタグに分割するプログラムは、語彙分析装置です。
私たちの言語は非常に少ないため、それぞれが値を持つ2種類のタグしかありません。
正規表現を使用してコード文字列からタグを抽出できますが、パフォーマンスは非常に遅くなります。より良いアプローチは、コード文字列の各文字をループしてタグを取得することです。それでは、マゼンタのクラスでトークン化方法を作成しましょう。これは語彙分析装置になります。
完全なコード
javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { const length = this.codes.length; // pos 用于跟踪当前位置/索引let pos = 0; let tokens = []; const BUILT_IN_KEYWORDS = ["print"]; // 变量/关键字允许的字符const varChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; while (pos <code>); } } return tokens; } parse(tokens) { const len = tokens.length; let pos = 0; while (pos parse(tokens);
const codes = print "hello world" print "hello again"
;
###ルールと構文の定義コード注文がルールまたは構文と一致するかどうかを確認します。しかし、最初に、これらのルールと構文が何であるかを定義する必要があります。私たちの言語は非常に小さいため、単純な構文、つまり印刷キーワードに続いて文字列が続きます。
キーワード:文字列を印刷します
<code>因此,让我们创建一个解析方法,该方法循环遍历我们的标记,并查看我们是否形成了有效的语法。如果是这样,它将采取必要的措施。 ```javascript class Magenta { constructor(codes) { this.codes = codes; } tokenize() { /* tokenizer 的先前代码*/ } parse(tokens) { const len = tokens.length; let pos = 0; while (pos </code>
見て!私たちはすでに働く言語を持っています!
OKですが、コードを文字列変数に入れるのはそれほど楽しいことではありません。それでは、 Magentaコードをcode.mというファイルに入れましょう。これにより、マゼンタコードをコンパイラロジックから分離できます。 .mをファイル拡張子として使用して、ファイルに言語にコードが含まれていることを示します。
このファイルからコードを読みましょう。
//ファイルシステムモジュールconst fs = require( 'fs'); //パスモジュールをインポートして、パス接続を容易にしますconst path = require( 'path'); クラスマゼンタ{ コンストラクター(コード){ this.codes = codes; } tokenize(){ /*トークナイザーの前のコード*/ } parse(tokens){ /*以前の解析方法*/ } 走る() { /*以前の実行方法*/ } } // code.mファイルを読む//一部のテキストエディターは、\ nの代わりに\ r \ nを新しいラインとして使用するので、\ rを削除します const codes = fs .readfilesync(path.join(__ dirname、 'code.m')、 'utf8') .toString() .replace(/\ r/g、 ""); const magenta = new Magenta(コード); Magenta.run();
このようにして、私たちはゼロからミニプログラミング言語を正常に作成しました。プログラミング言語は、特定のものを完了するのと同じくらい簡単です。もちろん、ここのマゼンタのような言語が人気のあるフレームワークの一部になるのに役立つ可能性は低いですが、今ではプログラミング言語を作成するために必要なことを知っています。
空は限界です。深く掘り下げたい場合は、私が作成したビデオをフォローしてみてください。これにより、より高度な例が紹介されています。このビデオでは、言語に変数を追加する方法も示します。
以上が小さなプログラミング言語を作成しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。