構文解析

1/2ページ

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

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

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

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

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にのデバッグ機能は優秀です […]

10 式の解析(前置演算子、中置演算子) [オリジナル言語インタプリタを作る]

前置演算子 ここでは前置演算子がくっついた式の解析を実装します。難しいことはありません。識別子も数値リテラルも、前置演算子の解析関数として関連付けて処理しました。それと同様の手順で進めます。 実装する前置演算子は、否定 ! と マイナス - です。それぞれ以下のような式を解析します。 -5; !foo; 1 + -2; 中置演算子の直後に前置演算子が来るパターンも有効です。 次のような構造をしてい […]

09 式の解析(識別子) [オリジナル言語インタプリタを作る]

式の構文解析に取り掛かる これまでに文の解析、let文とreturn文についての構文解析を実装しました。これで Gorilla の実装における文は、基本的にこの2つのみです。ということで、ようやく式の解析に取り掛かります。 式の構文解析は、構文解析における本丸です。ここが一番厄介であり、面白い部分でもあります。 式の解析は一筋縄ではいかない 式の1つである四則演算による数式を考えます。 1 + 2 […]

08 ASTからコードを復元する [オリジナル言語インタプリタを作る]

式の構文解析の前に 式の構文解析に移りたいのですが、先にちょっとした確認用の機能を作っておきます。これが済んだら式の解析です。 ASTからソースコードを復元する機能 今回は、デバッグ用に使える機能を追加していきます。ASTからソースコードを作成する機能です。これがあると、後の式の解析機能を実装するのが楽になります。 ToCode() INode に ToCode() を追加します。すべてのASTは […]

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

return 文 引き続き、構文解析器(パーサー) を拡張していきます。今回は return文 をパースできるようにします。 パーサーの拡張拡張の方法は簡単です。 AST を定義する。 Ast を返す PrseXxx() を定義する。 ParseXxx() を呼び出す。 return文をいくつか具体例を挙げると以下のような感じです。 return 1; return x; return add(1 […]