2

言い換えて...

関数/条件を解析する最善の方法を知りたいです。したがって、次のようなものがある場合、[if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if]これは条件内の条件です。正規表現のみではこれを行うことができないようです。


元の質問

今のところ、アクション スクリプトを使用していくつかのコマンドを解析する非常に簡単な方法があります。

タグ、コマンド、オペランドを見つけるために正規表現を使用しています...

+key_word+  // any text surrounded by +
[ifempty +val_1+]+val_2+[/ifempty]  //simple conditional
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot]  // conditional with operands

私の現在のアルゴリズムは、一致しない場合でも、開始タグ[**]と最初の終了タグを一致させます。[/**]つまり、次のようなことができなかったことを意味します[ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty]-基本的に、ある条件を別の条件の中に入れます。

この正規表現に基づいて文字列を文字列の配列に分割するインライン解析方法を使用しています\[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]

より堅牢な解析規則/標準を使用して、より堅牢なアルゴリズムを提案できる人はいますか? 特にas3の場合。

4

1 に答える 1

2

正規表現は正規言語を定義します。通常の言語には、制約されているが潜在的に無限の再帰の領域を含めることはできません。

これについての 1 つの考え方は、すべての正規言語は有限ステート マシンで表すことができるということです。可能な数のifごとに状態が必要になりますが、マシンは「有限」でなければならないため、バインドされています。古典的な例は次のとおりです。

a{n}b{n}, n >= 0
(meaning n a's, followed by n b's)

各 a を解析すると、別の状態に移動する必要があります (FSM には、その状態以外の記憶はありません。これが、n を記憶して後で一致させる唯一の方法です)。任意の数の n を解析するには、無限の数の状態が必要になります。

これはあなたがいるのと同じ状況です。正規表現は有限数の if を表現できますが (ただし、かなりのコピーと貼り付けが必要になります)、無限数ではありません。ただし、一部の正規表現の実装は少しごまかしており、数学的に同等のものよりも強力になっていることに注意してください。

いずれにせよ、最善の策は、より強力な解析方法を使用することです。再帰降下パーサーは、実装するのが特に楽しく、必要なことを簡単に実行できます。また、LR パーサーを調べたり、スタックを使用して単純なパーサーを構築したりすることもできます。言語によっては、Python の pyparse や C++ の Boost Spirit などの解析ライブラリを見つけることができる場合があります。

于 2010-11-15T21:53:50.590 に答える