当サイトの運営者です。ゲーム制作とプラグイン開発が好きで、コミュニティに貢献したいと考えています。
RPGツクールMZでゲームを制作中です。
※プログラマ・エンジニアではありません。
コマンドの簡易字句解析 - HSP_PluginCommandSimpleLex.js
シェア用テキスト:
▼コマンドの簡易字句解析(hirosof様作) - HSP_PluginCommandSimpleLex.js
https://plugin.fungamemake.com/archives/18936
プラグインコマンド文字列の分割方法を簡易的な字句解析を用いたものに置き換えます。
ふりがな:こまんどのかんいじくかいせき
機能概要: プラグインコマンド文字列の分割方法を簡易的な字句解析を用いたものに置き換えます。
利用規約(ライセンス): MITライセンス
作者:hirosof
作者サイト:https://x.com/hiroakisoftware
直接ダウンロード:Zipファイルファイル名:HSP_PluginCommandSimpleLex.js
プラグインのヘルプ:
/*:
@plugindesc プラグインコマンド文字列の分割方法を簡易的な字句解析を用いたものに置き換えます。
@author hirosof
@help
このプラグインはプラグインコマンドの分割方法を既定の半角スペース区切りから
簡易的な字句解析を用いたものに置き換えるものになります。
具体的にツクールのイベントエディタから
「TestCommand ”Sample parameter with space” secondParameter」
というコマンド(このコマンドをベースコマンドと呼ぶことにします)
を実行したとし、プラグイン側で書き換えられた
Game_Interpreter.prototype.pluginCommand関数の
第1引数をCommandName、第2引数をargsと仮定した例を挙げます。
このとき、デフォルトの状態だと各引数の値は以下のようになります。
CommandName = TestCommand
args[0] = ”Sample
args[1] = parameter
args[2] = with
args[3] = space”
args[4] = secondParameter
これに対し、本プラグインを用いると以下のようになります。
CommandName = TestCommand
args[0] = Sample parameter with space
args[1] = secondParameter
また、 ベースコマンドの「TestCommand」と「”(ダブル九クォーテーション)」の間の半角スペースを2つにした場合
デフォルトの場合:
CommandName = TestCommand
args[0] =
args[1] = ”Sample
args[2] = parameter
args[3] = with
args[4] = space”
args[5] = secondParameter
本プラグイン使用の場合:
CommandName = TestCommand
args[0] = Sample parameter with space
args[1] = secondParameter
となり、ベースコマンドの「space”」と「secondParameter」の間の半角スペースを同様に2つにした場合
デフォルトの場合:
CommandName = TestCommand
args[0] = ”Sample
args[1] = parameter
args[2] = with
args[3] = space”
args[4] =
args[5] = secondParameter
本プラグイン使用の場合:
CommandName = TestCommand
args[0] = Sample parameter with space
args[1] = secondParameter
となり、さらにベースコマンドの「TestCommand」と「”(ダブル九クォーテーション)」の間及び
「space”」と「secondParameter」の間の半角スペースをそれぞれ2つにした場合
デフォルトの場合:
CommandName = TestCommand
args[0] =
args[1] = ”Sample
args[2] = parameter
args[3] = with
args[4] = space”
args[5] =
args[6] = secondParameter
本プラグイン使用の場合:
CommandName = TestCommand
args[0] = Sample parameter with space
args[1] = secondParameter
となり、本プラグインを使用した場合はいずれのパターンも同じデータが渡されます。
ちなみに、ベースコマンドにあるダブルクォーテーションを省いて
「TestCommand Sample parameter with space secondParameter」
とした場合は デフォルト、本プラグイン共に
CommandName = TestCommand
args[0] = Sample
args[1] = parameter
args[2] = with
args[3] = space
args[4] = secondParameter
となりますが、コマンドにある半角スペースの数が各1つずつでないとデフォルトの場合どこかに
空要素が入ることになります。
ここまで、読んでくれたユーザーにはすでにお分かりかと思いますが、
ダブルクォーテーションで囲まれたものは間にスペースがあろうと一つの文字列とみなすようになっております。
また、シングルクォーテーションで囲んでも同等の結果を得ることが出来ます。
さらに、
シングルクォーテーションで囲まれた中にあるダブルクォーテーションは文字列の終了ではなく
単なる文字としてのダブルクォーテーションとしています。
つまり、「TestCommand 'abc ”def”'」というコマンドの場合
CommandName = TestCommand
args[0] = abc ”def”
となります。
同様にダブルクォーテーションに囲まれた中にあるシングルクォーテーションも次のように
文字としてのシングルクォーテーションとしています。
コマンド : 「TestCommand ”efg 'hij'”」
各プラグイン上:
CommandName = TestCommand
args[0] = efg 'hij'
以上。説明おわります。
*/
/*
Game_Interpreter.prototype.pluginCommandに渡される
プラグインコマンドの解析をスペース区切り分割から簡易字句解析にします。
*/
Game_Interpreter.prototype.command356 = function() {
/*
未解析のプラグインコマンド文字列を得る
*/
var rawCommand = this._params[0];
/*
最初の半角スペースを検索し、あればそこの一つ前までをコマンド名とみなし、
なければrawCommand全体をパラメータなしのコマンドとみなす
*/
var CommmandNameLength = rawCommand.indexOf(” ”);
var CommandNameOnly = false;
if(CommmandNameLength == -1){
CommandNameOnly = true;
CommmandNameLength = rawCommand.length;
}
var CommandName = rawCommand.slice(0 , CommmandNameLength);
/*
空の配列を用意する
*/
var Params = new Array();
/*
パラメータがあるならば分割用解析に入る
*/
if(CommandNameOnly == false){
/*
最初の半角スペースの次から最後まで取り出し、前後の半角スペースを削除する
*/
var rawParameterText = rawCommand.slice(CommmandNameLength+1).trim();
/*
出力先の要素番号
*/
var ParamIndex = 0;
/*
----------------------------------------------
[基本]
変数QuotationTextModeはクォーテーションモードを示し、
値と意味は以下のとおりである。
0 ・・・ 無効状態(モード未使用もしくは解除状態)
1 ・・・ シングルクォーテーションモード
2 ・・・ ダブル九クォーテーションモード
----------------------------------------------
[詳細]
クォーテーションモードとは現在位置が
シングルクォーテーションで囲まれているのかそれとも
ダブルクォーテーションで囲まれているのかを識別するためのものである。
シングルクォーテーションモードは現在位置が
シングルクォーテーションで囲まれていることを示すモードである。
ダブルクォーテーションモードは現在位置が
ダブルクォーテーションで囲まれていることを示すモードである。
*/
var QuotationTextMode = 0;
/*
解析ループ
*/
while(rawParameterText.length > 0){
/*
先頭の文字を取得する
*/
var c = rawParameterText.charAt(0);
/*
出力先が未初期化(未定義)ならば、空文字列で初期化する
*/
if(Params[ParamIndex] == undefined) Params[ParamIndex] = ””;
/*
読み込んだ先頭の文字を解析する
*/
switch (c) {
/*
シングルクォーテーションで囲まれた文字列は、半角スペースを含め一つの文字列とみなす。
また、シングルクォーテーションで囲まれた文字列の中でダブルクォーテーションがあった場合、
そのダブルクォーテーションを文字とみなす。
*/
case ''':
if(QuotationTextMode==0){
/*
クォーテーションモードが無効の場合は
シングルクォーテーションモードにする。
*/
QuotationTextMode = 1;
}else if(QuotationTextMode == 1){
/*
シングルクォーテーションモードが有効の場合は
クォーテーションモードを解除し、出力先の要素を一つ進める。
*/
QuotationTextMode = 0;
ParamIndex++;
}else if(QuotationTextMode == 2){
/*
ダブルクォーテーションモードが有効の場合は
シングルクォーテーションを文字とみなすため
シングルクォーテーションを出力先に出力する。
*/
Params[ParamIndex] += ''';
}
break;
/*
ダブルクォーテーションで囲まれた文字列は、半角スペースを含め一つの文字列とみなす。
また、ダブルクォーテーションで囲まれた文字列の中でシングルクォーテーションがあった場合、
そのシングルクォーテーションを文字とみなす。
*/
case '”':
if(QuotationTextMode==0){
/*
クォーテーションモードが無効の場合は
ダブルクォーテーションモードにする。
*/
QuotationTextMode = 2;
}else if(QuotationTextMode == 2){
/*
ダブルクォーテーションモードが有効の場合は
クォーテーションモードを解除し、出力先の要素を一つ進める。
*/
QuotationTextMode = 0;
ParamIndex++;
}else if(QuotationTextMode == 1){
/*
シングルクォーテーションモードが有効の場合は
ダブルクォーテーションを文字とみなすため
ダブルクォーテーションを出力先に出力する。
*/
Params[ParamIndex] += '”';
}
break;
/*
現在位置がダブルクォーテーションもしくはシングルクォーテーションで囲まれているときは
出力先に半角スペースを出力し、そうでなければ出力先の要素を一つ進める。
但し、余分な空要素が発生するのを防ぐ目的で現在の要素に1文字もなければ
現在の出力先の要素番号を保持する。
*/
case ' ':
if(QuotationTextMode == 0){
if(Params[ParamIndex].length > 0) ParamIndex++;
}else{
Params[ParamIndex] += ' ';
}
break;
/*
上の各種チェックに該当しない文字はそのまま出力バッファに出力する
*/
default:
Params[ParamIndex] += c;
break;
}
/*
先頭の文字を削除した文字列を得る
*/
rawParameterText = rawParameterText.slice(1);
}
}
/*
プラグインコマンドを各プラグインに送信する。
*/