0

各要素の内容を直接ではなく、要素が表示される順序である配列の「ジオメトリ」にパターンマッチングする方法を探しています。

いくつかの例で私が何を意味するのかを概説しましょう。ターゲット配列が与えられた場合:

array('T_STRING','T_VARIABLE','ASSIGN','T_STRING','LPAREN','T_VARIABLE','COMMA','T_VARIABLE','RPAREN');
//as a matter of fact, these would be the tokens for the PHP code "foo $var = Foo($arg1,$arg2)'

次に、次の「パターン」が一致し、preg_match_all()が文字列に対して行うのと同じように、一致の0ベースのインデックスとグループ化のインデックスが返されます。

array('T_STRING', '?', '(', 'T_VARIABLE', 'ASSIGN' ')', '?',
    'T_STRING', 'LPAREN', '(', 'T_VARIABLE', 'COMMA', '?', ')', '?', 'RPAREN');

これは単純化されたPoCにすぎず、私が使用する方法ははるかに複雑であり、PEAR(PHPへのレモンポート)からの完全なパーサジェネレーターを使用したくありません。

それを実行する関数(おそらく内部PHP関数ではない)またはプロジェクトを知っていますか?

ありがとうございました。

4

2 に答える 2

1

「パターンマッチング」と聞くと「正規表現」だと思います。

その配列を文字列にプッシュし、正規表現を使用して探しているパターンと照合します。正規表現を小さくて扱いやすいものにするために、シンボルを置き換えることができる場合があります。

上記の配列は、次のような文字列に減らすことができます。

$arrayPattern = 'SVASL_PVCVR_P'

これで、RegEx を使用して照合できます。

if (preg_match('/VA/', $arrayPattern)) 
  print "You've got a Variable followed by an Assign!";

ちょっとした考え....

于 2009-11-25T19:53:52.453 に答える
1

コード分​​析を探しているなら、Sebastian Bergmann のこれらのスライドが役に立つかもしれません。スライド 17 以降は、トークンによる分析の例です。

于 2009-11-25T20:07:17.773 に答える