0

ブロックが相互にまたはそれ自体をネストしない場合、次のステートメントで複数行のブロックを一致させるにはどうすればよいですか。

       if (EXPR) BLOCK
       if (EXPR) BLOCK else BLOCK
       if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
       unless (EXPR) BLOCK
       unless (EXPR) BLOCK else BLOCK
       unless (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
       LABEL while (EXPR) BLOCK
       LABEL while (EXPR) BLOCK continue BLOCK
       LABEL until (EXPR) BLOCK
       LABEL until (EXPR) BLOCK continue BLOCK
       LABEL for (EXPR; EXPR; EXPR) BLOCK
       LABEL foreach VAR (LIST) BLOCK
       LABEL foreach VAR (LIST) BLOCK continue BLOCK
       LABEL BLOCK continue BLOCK

これが正規表現で実行できない場合、それを実行できるステートマシンはありますか?

4

2 に答える 2

9

Perlを自分で解析しようとしないでください。本当に必要な場合は、まともな仕事をするPPIを使用してください。

use PPI;
my $source = 'LABEL: { print "block" } continue { print "cont block" }';
my $doc = PPI::Document->new(\$source);
my $blocks = $doc->find("PPI::Structure::Block");
print ":$_:\n" for @$blocks;
于 2012-11-26T01:22:14.420 に答える
2

これはまったくできません。一般に、任意のPerlコードを解析する場合は、Perlも実行できる必要があります。これは、解析時に実行され、残りのコードの解析方法に影響を与える可能性があるためですuseBEGIN

例:

use Some::Module;
foo / 1;
is_this_code();
#/;

これがどのように解析されるかfooは、宣言された方法によって異なります。通常の関数の場合は、正規表現の結果とともに呼び出され/ 1;\nis_this_code();\n#/ます。のプロトタイプで宣言されている場合()、コードはの戻り値をfoo1で除算してから、を呼び出しますis_this_code()

于 2012-11-26T01:24:08.760 に答える