2017-01-09 15 views
2

文字列(おそらくstd::string)が有効なC++式であるかどうかをテストする必要のあるプログラムをC++で作成しています。変数が宣言されていれば(bool variableDeclared(std::string identifier))、変数の型をチェックすることもできます(std::string variableType(std::string identifier))。 variableType関数は、C++("bool""double""char"など)で宣言される方法に基づいて文字列を返します。文字列が有効なC++(ish)式であるかどうかをテストする方法は?

この式は評価する必要はなく、有効かどうかをテストするだけです。関数は文字リテラル、文字列リテラル、数値リテラル、ブラケット、簡単な演算子をサポートする必要がある(+-*/!(ロジックではない)、&&||><==)、およびタイプdoubleの変数、std::string(関数呼び出しは不要)、boolおよびchar。また、文字列連結をサポートする必要もありません。

希望の結果は、bool validExpression(std::string expression)のような関数になります。また、操作を変更することもできます(たとえば、"==""equal-to"に変更することができます)。

どうすれば実装できますか?このようなことができるライブラリ、正規表現のステートメント、または単にifステートメントがたくさんある長い関数の問題ですか?

+0

コンパイルしてください。それがコンパイルされたら、*多分*有効なコードです。この練習の目的は何ですか?あなたはスクリプト言語を書こうとしていますか?これは、長い、醜い道を行くことができますが、それはまた非常に興味深いです。コンパイルして任意のコードを実行することは、コードを提供する人々を絶対に信頼しない限り、非常に悪い考えです。 – tadman

+0

もしあなたが冒険しているなら、[Ragel](http://www.colm.net/open-source/ragel/)のようなツールを使ってパーサを実装してみてください。 – tadman

+0

Context Free Grammar [CFG]を構築してから、指定された文字列を[CFG]で生成できるかどうかを確認する必要があります。 – sameerkn

答えて

4

正式には、検証する式の言語を記述した文法と、それを判断するための単語その言語に属します。これは、その言語のパーサの仕事です。

再帰下降LL(1)パーサーのようなものを手で作ったり、ツールを使ってパーサーを生成することができます。このようなツールのよく知られた例は、LALR(1)パーサーを生成するためのBisonである。ウィキペディアの長さはparser generator listです。


技術用語は、主にグーグルのエントリポイントを提供するために使用されます。

+2

おそらく、これを手で書くのが最も簡単な方法は、相互に再帰的な関数のセット(ルックアップ再帰的な降下)です。 – melpomene

+0

@melpomene:この答えを示唆しているように、これを書き込む最も簡単な方法はbisonです。文法の数行以上になることはありません。特に、演算子を区別する必要がない場合は特にそうです。レクサーを構築するために12行のフレックスを追加すると、完了です。 – rici

+0

@riciしかし、バイソンは「手で」ではなく、私のコメントについてです。そして、それは一般的に最も簡単な方法であるとは思っていません。あなたが以前にパーサを書いたことがないならば、簡単な構文チェッカーのためだけに2つの全く新しいツール(bison、flex)を学ぶことは非常に高い障壁になります。 – melpomene

-3

アプリケーションのサブプロセスとしてコンパイラを実行できます。引数を渡して応答を適切に解析するだけです。

+1

これは1)かなり重量がある、2)OPのプログラムと一緒にコンパイラをインストールする必要があり、3)OPが望んでいないもの(関数、条件演算子など)を受け入れるだろう – Angew

+1

そして、 (例えば、 '=='を 'equal-to'に変更するなど)。 – melpomene

+0

@Angew、構文チェック専用のフラグ –

1

あなたの言語を正式に定義することから始めます。 (言語は文字列の集合です)。言語を定義する良い方法は、文脈自由文法を指定することです。宣言文で非形式的に条件を記述すること(変数を宣言し、適切な型を指定する必要があるなど)

次の手順では、前の手順で指定した文法のパーサーを作成します。文法から自動的にyacc/bisonからboost :: spiritまでパーサを構築するためのツールがいくつかあります。

パーサーを構築して確認した後、非公式に指定されたルールを実装し、パーサーコード/データにプラグインします。

通常、評価者を作成する次のステップは、おそらく単純なインタープリタを作成する最も簡単な部分ですが、必要がないと言います。

あなたの言語を「特定のビットを取り出しただけでC++と同じように」記述することは、上で概説したシーケンスの予備ステップです。ただし、C++から始めるのはお勧めできません。 C++は形式的に指定するのが非常に難しい言語であり、そのパーサーは複雑な宣言構文のためにかなり毛深い傾向があります。

関連する問題