Java で実装された JavaScript コレーター/コンポジターに取り組んでいます。それは機能しますが、それを実装するためのより良い方法が必要であり、レクサーが前進する方法かもしれないと思いますが、私は少しあいまいです.
JavaScript 言語のサブセットであるコンポジターのメタ構文を開発しました。典型的な JavaScript インタープリターに関する限り、コンポジターのメタ構文は有効ですが、機能しません (コンポジターが解釈するはずのコード ブロックが後に続くラベルとして、予約語の同義語を使用しています)。現在、スキャナーと正規表現を使用してソース ファイル内のメタ構文を検出し、法的な表現の検出に基づいて浅い字句変換を行っています。
書き直された JavaScript とスキャナー/パーサーの間には密接な関係がありますが、これは満足のいくものではありません。書き直された JavaScript は、この目的のために特別に作成されたオブジェクト サポート ライブラリの機能を使用しており、そのライブラリは変更される可能性があります。
Backaus-Naur または EBNF でメタ構文だけを宣言し、それをレクサー (ANTRL?) にフィードし、ソース ファイルで検出されたメタ構文式に基づいて、コンポジターに特定のアクションを指示できることを願っています。必要なスクリプトを別のスクリプトに追加したり、変数を宣言したり、適切にパラメータ化されたライブラリ関数呼び出し用のテキストを生成したり、スクリプトを圧縮したりします。
これはコンポジターを作成する適切な方法ですか? JavaScript を合成するためにスキャナー/パーサー/レクサーのアプローチを使用する必要がありますか? フィードバックをいただければ幸いです。どこから始めればよいかわかりません :)
更新: これは、より具体的な例です-メタ構文を使用したサンプルオブジェクト宣言:
namespace: ie.ondevice
{
use: ie.ondevice.lang.Mixin;
use: ie.ondevice.TraitsDeclaration;
declare: Example < Mixin | TraitsDeclaration
{
include: "path/to/file.extension";
// implementation here
}
}
これは、オブジェクト ie.ondevice.Example を記述します。これは、Mixin を継承し、TraitsDeclaration に似ています (つまり、「同じ関数と特性を実装します」)。コンポジターは use ステートメントを検出し、名前空間が有効なファイルの場所にマップされていない場合は失敗します。そうでない場合は、オブジェクト宣言が存在するスクリプトの先頭に追加し、照合前にメタ構文を前処理します。
私が言及したオブジェクト サポート ライブラリの観点から表現された書き換え規則は、次のようなファイルになります(私はオブジェクトを表現する方法をいくつか開発しました)。
module("ie.ondevice.Example", function (mScope)
{
// mScope is a delegate
mScope.use("ie.ondevice.lang.Mixin");
mScope.use("ie.ondevice.TraitsDeclaration");
// As a result of two use statements, the mScope.localVars string would
// would look like this: "var Mixin= ie.ondevice.lang.Mixin, TraitsDeclaration= ie.ondevice.TraitsDeclaration
// by evaling we introduce 'imported' objects with their 'local'names
eval(mScope.localVars);
// Function.prototype has been extended with the functions
// inherits, define, defineStatic, resembles and getName
// Prototypal inheritance using an anonymous bridge constructor
Example.inherits(Mixin);
// named methods and properties are added to Example.prototype
Example.define
(
// functions and other properties
);
// ensures that Example.prototype has all the same
// property names and types as TraitsDeclaration.prototype
// throwing an exception if not the case.
// This is optionally turned off for production- these
// operations are only performed when the object is declared
// - instantiation incurs no additional overhead
Example.resembles(TraitsDeclaration);
// constructor
function Example ()
{
Mixin.call(this);
};
// will generate the ie.ondevice object hierarchy if required
// and avail the constructor to it
mScope.exports(Example);
});
おそらく私は自分の要件を設計しすぎていますが、私が本当に欲しいのは、イベント駆動型のコレーターです。リスナーは、ディレクティブ検出に疎結合できます。