0

これは構文チェッカー用です。(ええ、正規表現を使用するのは理想的ではないことはわかっています) リーダーは、それがint| float| | char| | bool一部であり、宣言と初期化が構文的に有効かどうかを確認する必要があります。ff は、私の条件が通過する必要がある str のサンプルです。

a;
a, _b2;
a, _b2=0;
a=1, _b2=0;
a=1+1, _b2=a+1, c, d=555, e;
a=2.33;
a='a', b=3;
a="asb", b='3';
a=true, b=false, c="false";

渡してはならない:

a= , b2 = 1;
a = ;
a = '23;
a = 50, b = a+1
a = a.23;

私が作った状態は、見たときに一致し=ません。状態を修正するのを手伝ってくれませんか

^(\s*[A-z_][A-z0-9]*\s*(=\s*0-9|=\s*"[^]*"|=\s*'[^]*')?\s*,)*\s*[A-z_][A-z0-9]*\s*(=\s*0-9|=\s*"[^]*"|=\s*'[^]*')?\s*;

UPDATE : 浮動値と見なされます

UPDATE : int、float、char、および boolean 値に適用できる一般的な正規表現にしました

4

2 に答える 2

1

C++ 宣言を解析できるほど強力な正規表現は世界中にありません。これは、文法が非常に文脈依存である (そして、おそらく実際には決定できない) という非常に単純な理由によるものです。

たとえば、ここIsPrimeで定義されたテンプレートを使用して、次のような宣言を記述できます。

int a = foo<IsPrime<234799>>::typen<1>();

これは、 234799 が素数の場合にのみ構文的に有効です。

別のアプローチを使用して C++ を検証することを検討してください (例: g++ -fsyntax-only)。

于 2013-08-24T18:45:02.013 に答える