2/28ページ

2/28ページ

20 評価プロセス(中置演算, 四則演算ほか) [オリジナル言語インタプリタを作る]

中置演算式 の評価 プログラミング言語 Gorilla がサポートする中置演算子は以下の8つです。 1 + 2; 1 - 2; 1 * 2; 1 / 2; 1 > 2; 1 < 2; 1 == 2; 1 != 2; これらの演算子は大きく2つのグループに分かれます。上4行の四則演算は結果を整数として生成するグループで、下4つの比較を行う演算は結果を真偽値で生成するグループです。 まずは […]

19 評価プロセス(前置式 “-“, “!”) [オリジナル言語インタプリタを作る]

真偽値 整数リテラルの評価に続いて真偽値リテラルの評価を実装します。とはいえやることは整数リテラルの評価とほぼ変わりません。 テストの作成 まずはテストを作成します。 [TestMethod] public void TestEvalBooleanExpression() { var tests = new(string, bool)[] { ("true;", true), ("false", […]

18 評価プロセス(リテラル) [オリジナル言語インタプリタを作る]

評価プロセス ここまでで字句解析、構文解析と終りました。ようやくREPLでいうところの E(Eval, 評価)に移ることができます。 インタプリタにおける評価のプロセスは、プログラムがどのように動作するかを定義する必要があります。 例えば以下のプログラムを例に考えます。 let num = 5; if (num) { return 1; } else { return 0; } これが 1 を返す […]

17 REPLを構文解析に対応する [オリジナル言語インタプリタを作る]

TODO を修正する (return, let) 全ての構文解析機能の実装が終了しましたが、以前作成したTODOが残ったままになっています。これを修正することで本当の完成になります。 修正する箇所は以下の2点。ParseLetStatement() と ParseReturnStatement() です。 Parsing/Parser.cs public class Parser { // .. […]

16 構文解析器の拡張(関数呼び出し式) [オリジナル言語インタプリタを作る]

関数の呼び出し式 関数の呼び出し式を解析できるようにします。以下のような使い方ができます。 let result = add(1, 2); 式なので値を返せます。 識別子の後ろに引数指定の () がある、というのが構文規則でしょうか。実はそうではありません。あらゆる式に対して関数呼び出しを行えます。 どういうことでしょうか。たとえば関数リテラルを用いた即時呼び出しも有効です。 fn (a, b) […]

15 構文解析器の拡張(関数リテラル) [オリジナル言語インタプリタを作る]

関数リテラル これまでいろいろと構文解析を実装してきました。今回は関数リテラルを解析できるようにします。 関数もまた、真偽値や整数と同じくリテラルで定義できます。関数を宣言するのではなくリテラルで扱います。 つまり識別子や整数と同じように式として定義するので、引数で渡したり return で返したりできます。 fn(x, y) { return x + y; } これが関数リテラルです。キーワード […]

14 構文解析器の拡張(if式) [オリジナル言語インタプリタを作る]

if式 現在実装中のプログラミング言語 Gorilla では多くのプログラミング言語と同じような構文で if, else を使えます。 if (x > y) { return x; } else { return y; } また、if文ではなくif式です。つまり値を返すということです。次のようにif式の結果を代入できるということです。なお、returnも省略可能です。その場合、最後に評価され […]

13 構文解析器の拡張(式を括弧でグループ化する) [オリジナル言語インタプリタを作る]

式を括弧でグループ化する 式を括弧でくくって演算の優先度を調整することができます。一般的な計算式と同じ考えです。 例えば 1 + 2 * 3 この式は (1 + (2 * 3)) となります。 括弧を付けた式 (1 + 2) * 3 は ((1 + 2) * 2) とならないといけません。括弧内の式はより高い優先度で計算されます。 この違いを式の構文解析処理に実装します。優先度の実装は思っているほ […]

12 構文解析器の拡張(真偽値リテラル) [オリジナル言語インタプリタを作る]

構文解析器の拡張 ここまでで、式の構文解析を完成させることができました。return文、let文についても実装済です。 今回は真偽値リテラルの構文解析処理の実装を行います。 テスト用ヘルパ関数の作成 具体的な実装に移る前に、テスト用のヘルパ関数を先に作成しましょう。 整数リテラルの実装時に _TestIntegerLiteral() というヘルパ関数を作成しました。同様に _TestIdentif […]

11 Pratt 構文解析 [オリジナル言語インタプリタを作る]

Pratt 構文解析 Pratt構文解析 という手法で式の構文解析を実装してきました。ここまでの実装で演算子の優先度を考慮したうえで、正しいASTノードを構築できるようになりました。 しかし実装がうまくいったのはテストを作成することで確認できましたが、詳しい説明は端折っていました。詳しい理論はぶっちゃけわからないのですが、どのように動作するかを見ていこうと思います。 VSにのデバッグ機能は優秀です […]

1 2 28