2016-07-01 6 views
0

私はC++でコンソールアプリケーションを作成しています。アプリケーションでオプションを設定するには、ユーザーシェルのようなコマンドシステムを取得する必要があります。 |C++でコマンドツリーを解析するには?

レジスタ

接続オープン[telnetの:例えば、ユーザはこのような何かを書くことができSSH]

接続スイッチのtelnet

テキスト

接続スイッチSSH

を送信

--register 
| 
--connetion 
|   |--open 
|   |--switch 
| 
--send 

はが


だから、明らかに我々はいくつかのコマンドツリーを持って、上の例では、我々が持っているようにテキスト

...とを...送ります

各コマンドは、異なる量のパラメータを持つことができます。


QUESTION:

  • どのようなコマンドツリーを解析するには?

ここで正規表現で解析しますが、この解決策は実際には醜いです。私はYACCとLEXについて読んだことがありますが、これを使うのは本当に良いアイデアだとは思いません。

コマンドツリーを解析する方法が広く使われていますか?私は字句解析理論では涼しいわけではないので、あなたが学問的な方法で答えるなら、私は感謝します。

+0

提案:: - >(状態、オプションの<はstd ::機能>)遷移関数(状態、CHAR)を持つステートマシンを使用してあなたの例の引数の木を使用して

。 – lorro

答えて

0

Thisは、GNU Cライブラリを使用することができれば、いくつかのオプションがあります。

最後に、それぞれのargを切り替える必要があります。ネストしたコマンドの状態を把握する必要があるかもしれません。

switch (arg) 
{ 
    case "register": 
    { 
     register = 1; 
     break; 
    } 
    case "connection": 
    { 
     connection = 1; 
     break; 
    } 
    case "open": 
    { 
     if (previousCommand == "connection") 
      connectionOpen = 1; 
     else 
      //error 
     break; 
    } 
    case "switch": 
    { 
     if (previousCommand == "connection") 
      connectionSwitch = 1; 
     else 
      //error 
     break; 
    } 
    case "send": 
    { 
     send = 1; 
     break; 
    } 
    previousCommand = arg; 
} 
+2

私はあなたが 'case'ステートメントのために文字列を使うことはできないと確信しています。 – Galik

+0

あなたの答えをありがとうが、それは各コマンドの状態を使用することはあまり良い考えではないと思う。特にコマンドツリーがかなり大きいとき。 –

+0

@Galikもちろん、私たちはできません。しかし、文字列をユニークな列挙型の値に変換するのはそれほど大きな問題ではありません。 –

関連する問題