0

コマンドを解析するためのパーサーを作成する必要があります。5つのそのようなコマンドは次のとおりです。

"a=10"
"b=foo"
"c=10,10"
"clear d"
"c push_back 2"

最初の例の場合、setはコマンド、aはオブジェクト、10は値です。

上記の各行について、パーサーは何を返す必要があると思いますか?

これが私の考えです:

   "a=10" -> SET (COMMAND_ENUM), INT (VALUE_TYPE), "a", ("10")
   "b=foo" -> SET (COMMAND_ENUM), STRING (VALUE_TYPE), "b", ("foo")

これは良いアプローチですか?この問題の標準的なアプローチは何ですか?代わりに発送する必要がありますか?

オブジェクトに関連付けられている型をチェックする関数があります。たとえば、a上記はタイプINTであり、値を割り当てる必要がありINTます。そうしないと、パーサーは何らかのエラーを返すかスローする必要があります。文字列から目的のタイプに値を変換するための変換関数もあります。変換が不可能な場合、これらはスローされます。パーサーが値を文字列から必要なタイプに変換しようとする場合は、boost::variantを介して値を返すことをお勧めします。

4

1 に答える 1

1

認識したいコマンド言語について、少なくとも準形式的な文法を考え出す必要があります。これは、多くのことを非常に漠然と指定したままにしているからです (たとえば、変数名にしb=fooたいのに文字列にしたい場合など)。リテラル. それらをどのように区別しますか?. 文字のシーケンスは、代入の右側にある場合は識別子を表しますが、左側にある場合はリテラルを表しますか? または、単一の文字は識別子を表しますが、複数の文字はリテラル?) Inはリストまたはベクトルを表しますか? 文法を書くことで、少なくともそのようなことを考えるように強制されます。また、少なくともパーサーの書き方のガイドとしても役立ちます (せいぜい、パーサーに自動的に変換できるものになります)。bfooc=10,1010,10

ステートメントを抽象構文木 (AST) として表現する方法を考えると、正しい方向に進んでいますが、一歩後退して、具体的な構文の観点から何が必要かを検討する必要があります。

于 2012-09-19T12:45:13.653 に答える