February 2008 - Posts
簡単な言語を作るシリーズで NyaRuRuさんがDLRのASTだけを使った方法 というのを解説していると取り上げました。DLRのソースコードを使わないで、DLRのASTだけを扱う方法を以下に示します。 using System; using System.Collections.Generic; using Microsoft.Scripting; using Microsoft.Scripting.Ast; namespace AstTest { delegate void MyFunc();
Read More...
IronPython 2.0 A8で提供されているDLRを見ていると、 IronPython 2.0A4の-X:PreferComDispatch がどのような機能として提供されているかに気が付くことができます。具体的には、上記のエントリーで私が「DLRにCOMサポートとしてのIDispachサポートが入って欲しいと考えています」と記載したことが、カスタムActionとして実装されていることです。Microsoft.Scripting.Actions.ComDispatchというネームスペースにCOMを扱うための振る舞いを提供するカスタムActionが提供されています。これが何を意味するかと云えば、言語実装者がCOMに対する振る舞いを追加したければ、このカスタムActionへマップすれば良いことを表しています。つまりIronPythonだけでなく、他の言語でもCOMオブジェクトを利用可能にすることができるインフラが
Read More...
DLRを使って四則演算ができる言語を数回に渡って作成しました。この中で利用したDLRのAPIなどを簡単にまとめたいと思います。大きくは、以下の2種類になります。 言語の実装(言語の規則など) インタラクティブシェル 言語そのものを作成するには、以下のようなクラスを作成しました。 LanguageContextクラス LanguageContextを継承したクラスであり、独自の言語の振る舞いやバージョン情報を定義する。ParseSourceCodeメソッドに独自の規則を実装する。 パーサーやスキャナなど
Read More...
前回まででパーサーを作成して、一応、動いているらしいところまで来ました。結果を表示できるようにする前に、どのようなASTが作成されているかを調べてみます。例えば、 「 1 + 2 」という式が入力されると以下のようなASTが作成されています。 そして「 (1 + 2) * 3 」という式を入力すると以下のようなASTが作成されています。 これはDLRのBinaryExpressionに式を構文解析した結果をマップしていることを表しています。そして上位にあるReturnStatementは、MyCalcLanguageContext.ParseSpourceCodeメソッドでAst.Returnを指定しているために指定されています。つまり、制御を戻せと指示しているのです。そしてBinaryExpressionとは、左と右に式を指定する基本的な式構文を表します。この理由から上記の例では、加算(Add)と乗算(Multiply)に展開しているのです。また括弧を加算のBinaryExpressionに展開することで、式の優先順位に合わせた形式にしています。
Read More...
これから例題として取り上げるMyCalcの言語仕様を説明します。基本的に四則演算ができる仕様とします。従って利用できるキーワードは以下のようなものにします。 演算子: +、-、*、/ 整数 括弧による優先順位:(、) このキーワードを意味のある単語として区別するためのクラスとしてTokenTypeクラスをParserフォルダに作成します。作成したコードは以下のようなものです。 using System; namespace MyCalc.Parser { enum TokenType { Empty,
Read More...
せっかくコンソールができたので、 「> 」 というプロンプトではなく、もうちょっと自分用のプロンプトにしたいと思います。自分の言語用のプロンプトを作成するには、HostingフォルダにMyCalcCommnadLineクラスを追加します。このクラスの定義を以下のようにします。 using Microsoft.Scripting.Shell; namespace MyCalc.Hosting { public class MyCalcCommandLine : CommandLine { private
Read More...
前回はIronPython 2.0 A8に含まれるDLRを使って、独自言語をホスティングするコンソールのみを作成しました。これから独自言語を定義していくのですが、その前にA6以前とA7以降のホスティングの変更点を説明します。 LanguageProviderが廃止され、LanguageContextに統一された。 上記に伴って独自のScriptEngineではなく、Microsoft.Scripting.Hosting.ScriptEngineを使用するようになった。 この2点の変更が非常に大きな特徴ではないかと私は考えています。A6のIronPythonでは、LanguageProviderを使って
Read More...
IronPython 2.0A8がリリースされて、DLR自体はA6以前とA7以降でホスティングの仕様が変更になっていると前回に説明しました。A8に含まれているDLRを使って、簡単な言語を作るにはどうしたら良いのかということを考えていました。そこで「 DLRで言語制作 」とか「 PiterさんのDLR Calculator 」とか「IronPythonに含まれているToyScript」を参考にしながら、やってみました。 最初に行うのはLanguageContextクラス、OprionsPerserクラス、自分のコンソールクラスの記述になります。最終的な目標を考えて以下のようなフォルダ構造のソリューションを作成します。
Read More...