主なアイデア
特定のマスクに一致する部分文字列を見つけるためのシステムは多数あります。 残念ながら、多くの要因を考慮する必要があるとすぐに彼らは力を失います。 設計は、扱いにくく、理解できず、保守が困難になります。
だからこそ、アナログ-REFAを作成しようとしました。 皆のための正規表現。
彼の考えは次のとおりです。 正規表現が明らかでなくなったらすぐに、2つに分けます。 可能な場合、オプティマイザーはそれを1に減らしますので、速度は低下しませんが、コードはより明確になります。
読みやすいように、 ge.tt / 9snPkzG / v / 0 (フォーマット\ .odt)
例
C ++関数の検索
ダミークラスのすべてのメソッドの実装を見つけます。
すべてのプロジェクトコードを含む大きな文字列が入力されると考えられています。 ファイルから読み取ることができますが、これにより例を理解するのが難しくなります。
PROGRAM “FindMethods” ^name^ = ~\w?[\w|\d]*~ BLOCK “FindClass” // PUSH BLOCKVAR $regexp = “class ”+%classname%+”\s*\{.*\}.*;” MATCH $regexp CATCH MATCH_FAIL RETURN array() AS $list; RETURN array() AS $result; FINISH BLOCKVAR $class_code = MATCHED INCOMING = $class_code BLOCKVAR $method = ^name^+~\w*~+^name^+~\([\^name\^\w*\^name\^\w*\,?]*\)\w*~ BLOCKVAR $declarations = array(); BLOCKVAR $realisations = array(); TRY WHILE 1 MATCH PASS LIMIT 1 $method IF select(0,1) INCOMING != “;” CALL “SearchEndOfFunction” REMAINED $realisations ADD (MATCHED + RESULT $body) ELSE $declarations ADD MATCHED ENDIF END ON MATCH_FAIL OR END_OF_STRING RETURN $declarations AS $list RETURN $realisations AS $result FINISH POP ENDBLOCK BLOCK “SearchEndOfFunction” BLOCKVAR UINT $level = 0 MATCH ~[\{|\}]~ FOREACH ALL_MATCHED AS $t IF $t == “{} $level++; ELSE $level--; ENDIF IF $level == 0 BLOCKVAR STRING $ret = select(ALL_MATCHED[0], ALL_MATCHED[ITERATION]) INCOMING_BLOCK RETURN $ret AS $body ENDIF END ENDBLOCK BLOCK “AddClassName” MATCH PASS LIMIT 1 ^name^+”\w*” BLOCKVAR $ret = MATCHED $ret += “[\^name\^\w*::\w*]*”+%classname%+”\w*::\w*” $ret += REMAIN RETURN $ret ENDBLOCK BLOCK “SearchDeclaredFunctions” BLOCKVAR $dec = %declared% IMPLODE ($dec, “|”) $string $string = “[“+$string+”]” MATCH $string BLOCVAR $realistaions = array() FOREACH ALL_TILES as $tile IF ITERATION % 2 == 1 IF select(0,1) INCOMING != “;” CALL “SearchEndOfFunction” ALL_TILES[ITERATION + 1] $realisations ADD (ALL_TILES[ITERATION] + RESULT $body) ENDIF ENDIF END RETURN $realisations AS $result ENDBLOCK // BLOCKVAR $classname = $arg1 CALL “FindClass” BLOCKVAR $ret = RESULT $result BLOCKVAR $declared = RESULT $list CALL “SearchDeclaredFunctions” $ret ADD RESULT $result RETURN $ret ENDPROGRAM
プログラムはそれほど小さくはありませんでしたが、少なくとも理解しやすいものでした。 これに似た正規表現...私はお勧めしません。
ドキュメント
データ型
INT
デフォルトのタイプ。 整数。 範囲-2 ^ 31から+ 2 ^ 31-1。 デフォルト値は0です。
長い
整数。 範囲-2 ^ 63〜+ 2 ^ 63-1。 デフォルト値は0です。
UINT
ULONG
STRING
ひも UINTの最大長。 プライベートフィールドSTARTおよびCOUNT。
デフォルト値は存在せず、例外が発生します。
タイル
文字列の一部。 プライベートフィールドSTART、END、COUNT、PARENT_STRING。
事前定義された変数
収入
処理する文字列。 変数が指定されていない場合は置換されます。
ICOMINGはINCOMING_CURRENTの同義語です
- INCOMING_PROGRAM-プログラムに来てください
- INCOMING_BLOCK-ブロックに入った
- INCOMING_CURRENT-現在の行
- INCOMING_LAST-最後の変更まで
一致
最初の試合は最後の試合で出てきました。
ALL_MATCHED
最後の式とすべて一致する配列。
残りました
MATCHEDの後の最初の文字
ALL_REMAINED
ALL_MATCHEDのそれぞれの後の最初の文字
ALL_TILES
すべて奇数はALL_MATCHEDです。 残りの行は、行の正しい順序で欠落している行です。
繰り返し
現在のループの反復数。 外部で反復数を取得するには、別の変数に保存します。
コールスタック
パラメータ付き呼び出しスタック
QUERY_LOG
何らかの形で行に影響を与えたコマンドのログ。 行をコピーすることを忘れないでください(突然、後続の処理がありました)。 着信データを単一のコピーに保存します。
EXCEPTION_STRING
エラーの本質を説明する行。 発生場所、入力パラメータ、結果。
最小セット
シンプルなシステムの使用に不可欠
一致
MATCH [IGNORE {ignore_count | FIRST}] [PASS] [LIMIT {limit_count}] reg_exp [processing_string]
reg_expを確認し、STARTをMATCHEDのprocessing_stringにシフトします(デフォルト)
IGNORE-最初のいくつかの一致をスキップします。 デフォルトのIGNORE 0
PASS-STARTを最後のALL_REMAINEDに移動
LIMIT-サブルーチンが中断するまでの一致の最大数。 デフォルトでは、LIMITは0です。これは、ファイルの終わりまで機能することを意味します。
reg_exp-〜の間に正規表現が指定されている場合があり、変数の場合があります。
processing_string-処理する文字列。 デフォルトの着信
エコー
ECHOストリング
結果に文字列を出力します。
正規表現を置き換える最も簡単な例は次のとおりです。
MATCH PASS〜some_regexp〜
FOREACH ALL_TILES AS $タイル
ITERATION%2の場合
//すべての一致する部分を文字列で置き換えます
エコー「交換」
その他
//一致する間のすべてのピースを変更せずに返します
ECHO $タイル
エンディフ
終了
その他の場合
IF expr then [ELSE else] ENDIF
式exprがゼロに等しくない場合、コードが実行され、そうでない場合
拡張セット
プログラム
プログラムは、必要なタスクを実行する実行可能なコマンドのアトミックセットです。 「デフォルト」以外のパラメーターを持つことができるのはプログラムのみです。
一般的に、これは別個のプロセス(またはスレッド)であり、並行して実行できます。 あるプログラムから別のプログラムにアクセスする方法はありません。 ただし、(宣言されている場合)隣接プログラムのメソッドを使用できます。 プログラムはプログラムを呼び出すことができます。
プログラムはすべてのブロックのスコープです。
デフォルトでは、すべてのコマンドはヌル名のプログラムに囲まれています(他のプログラムから呼び出すことはできません)
プログラム名arg0 [arg1 arg2 ...]コードENDPROGRAM
name-プログラム名
arg0は処理する文字列です。 INCOMING_PROGRAMになる
code-宣言を含むプログラムコード。
コードブロックには、構造を使用してアクセスします。
program_name :: block_name。
ブロック
ブロック名[文字列]
自己完結型のコード。 2つのgotoジャンプと同じです。 文字列が指定されている場合-開始する前に、対応するINCOMINGが戻ります。
ポッププッシュ
PUSH [var1 var2]
システム変数の状態を保存します。 ローカル変数を(列挙により)追加して保存し、!Var構文を使用して一部のシステム変数を明示的に除外することもできます。
POP-プッシュする前の状態に復元します
ブロックバー
現在のスコープでのみ使用でき、終了時に破棄される一時変数。
返品結果
ブロック/プログラムから一時変数の値を返すのに役立ちます。
戻り名
RESULT名は、呼び出し構文の変数にアクセスするために使用されます。
この値は、次のブロックが呼び出されるまで有効です。
エラー処理
スクリプトの実行中に、実行過程に影響を与えないさまざまな例外的な状況が発生する可能性があります。 これには例外システムがあります。
例外:exception_name [またはexception_name ...]
キャッチフィニッシュ
CATCH例外コード[CATCH例外コード...] FINISH
最初のCATCHブロックの前の行で発生したエラーをキャッチする必要があります。
このセクションの例外的な状況が予想され、処理される場合に使用されます。
仕上げを試してください
TRYコードON例外コード[ON例外コード...] FINISH
投げる
スロー例外
手動でエラーを生成する
エラーの種類
- MATCH_FAIL-正規表現の出現を見つけることができませんでした
- END_OF_STRING-何かが見つかる前に終わりに達しました(MATCH_FAILを意味します)
- WRONG_REGEXP-正規表現のコンパイルに失敗しました
- VARIABLE_OVERFLOW-変数オーバーフロー
- UNSIGNED_NEGATIVE-符号なしの数値に負の値を追加する
- WRONG_STRING_INDEXES-行の境界を超えるインデックスで行にアクセスしようとする
- OUT_OF_ARRAY-存在しない配列要素へのアクセスを試みます(外部)
特別なデザイン
〜正規表現〜
コンテンツ-正規表現
%name%
実行時に、$ name変数の値のコピーに置き換えられます。 (スタック上で最も近い)
#名前#
アナログ定義
^名前^
正規表現リファレンス 〜のような~~内で動作します
^こんにちは^ =〜hel {2} o〜
〜\ ^こんにちは\ ^世界〜
文字列を操作する
配列{タイル} SPLIT(デリメーター)[文字列]
タイルSELECT(開始、終了)[文字列]
PASS(カウント)[&文字列]
CUT(カウント)[&文字列]
CUT_AFTER(インデックス)[&文字列]
IMPLODE(配列[、デリミター])&文字列