0

私はPerlでC++スタイルのチェッカーを書いています。しかし、基本的なC++構造の正規表現を構築するのに苦労しています。たとえば、ifループは次の形式になります。

if( expression ) { またif ( expression ) ;

私が欲しいのは、コードが以下のガイドラインに従わない場合、エラーをスローすることです if<space>(expression)<space>{

これでexpression、論理演算子で複数行を区切ることができます。同じものの正規表現を作成するにはどうすればよいですか?

4

2 に答える 2

4

プログラミング言語は「正規言語」ではなく、厳密に言えば、正規表現で解析することはできません。ただし、Perl 正規表現を使用して、トップダウンの再帰文法全体を定義できます。このモジュールRegexp::Grammarsは、これを簡単に、強力に、整然としたものにします。

(?{CODE})また、構文解析中に警告を発行する構造を確認することもできます。文法のスニペットは次のようになります (簡単に説明すると、単純化されています)。

...;

<rule: if-statement>
if ( [ \t]+ | (?{warn q{no spaces around "if" condition at $line}}) )
    \( <statement> \)
   ( [ \t]+ | (?{warn q{no spaces around "if" condition at $line}}) )
   \{ <expression>+ \}

<rule: expression>
   <statement> ;

<rule: statement>
   <assignment> | <function-call> | \( <statement> \)

...;

このモジュールRegexp::Grammarsは、内部%/で使用できる構文ツリー全体を提供します。

于 2012-08-03T16:19:35.090 に答える
1

正規表現は、文脈自由文法を解析できるほど表現力がありません。正規表現を使用してレクサーをコーディングできますが、パーサーも作成する必要があります。

于 2012-08-03T16:05:25.267 に答える