2012-03-13 14 views
-1

構文を検索し、状態ごとに変化するプログラムを作成しようとしています その状態を示す必要があります。私は持ってはいけないべき別の出力を得ている。テキストの解析時の状態を維持する

using namespace cppfsm; 
#include <vector> 
#include <iostream> 

using std::cin; 
using std::cout; 
using std::endl; 
using std::vector; 

int cppfsm::updateState(int& state, char c) { 
    const int state1 = 1; 
    const int state2 = 2; 

    switch (state) { 
    case state1: 
     if (c == '/') 
      cout << "1" << endl; 
      // do stuff; update state 
     else if (c == '"') 
      cout << "1" << endl; 
      // do something else; update state 

    case state2: 
     if (c == '/') 
      cout << "1" << endl; 
      // do stuff; update state 
     else if (c == '"') 
      cout << "1" << endl; 
      // do something else; update state 

    } 
    return 0; 
} 

void testFSM(string s) { 
    vector<int> stlist; // list of states. 
    int cstate = start; 
    for (unsigned long i = 0; i < s.length(); i++) { 
     stlist.push_back(updateState(cstate,s[i])); 
    } 
    // push the last state: 
    stlist.push_back(cstate); 
    cout << s << endl; 
    for (unsigned long i = 0; i < stlist.size(); i++) { 
     cout << stlist[i]; 
    } 
    cout << endl; 
} 

int main() { 
    // the finite state machine: 
    string input; 
    while(getline(cin,input)) { 
     cout << " "; 
     testFSM(input); 
    } 
    return 0; 
} 

出力は次のようになります。 1から別の

$ echo "int x; // holds stuff" | ./fsm 
int x; // holds stuff 
0111010042222222222222 
$ echo 'cout << "some string";' | ./fsm 
cout << "some string"; 
01111000033333333333300 
$ echo 'cout << "\"escape\" chars are fun";' | ./fsm 
cout << "\"escape\" chars are fun"; 
011110000353333333533333333333333300 

に行くとき 数字は状態です。しかし、私の出力は、すべて0000 ......のように出てきます。この問題を解決するにはどうすればよいですか?

+0

最初はstartの値が何でありますか? – perreal

+0

最初は何を意味するのですか?あなたはcinから入力を得る。あなたは最初の状態として0を意味しますか? – user1261771

+0

はい初期状態の開始が投稿されたコードに定義されていません – perreal

答えて

1

あなたはstlistがすべて0である理由、updateStateためのreturn文を見て迷っている場合:

 return 0; 
} 

stlistを取り込むためのあなたのコードでこれを比較します

stlist.push_back(updateState(cstate,s[i])); 

限り私が知ることができるように、すべて0がこのコードの正しい動作です。明らかに、これは予想されるか、論理的な動作ではありませんので、私はupdateStateを変更する提案:あなたは、コードを実行したときに意図したとおり

int cppfsm::updateState(int& state, char c) { 
    // ... 
    return state; 
} 

stlistは、各状態変化が含まれている必要があります。

+0

'state'は常に' start'の値を保持しますが、これは変更を忘れたからです。 –

+0

@MooingDuck:私は*「do stuff;状態を更新する」*はそれをカバーしていました。もし彼が私たちに見せてくれないコードに問題があるなら、私はそのOPを助けることはできません。 – user7116

0

あなたは同じ値のupdateStateを呼び出しているようです。その値はスイッチでは処理されないので、関数はゼロを返します。つまり、stlistベクターにゼロを追加し続けるだけです。

スイッチの開始状態を処理し、updateState関数の戻り値をcstate変数に割り当てる必要があります。

+0

'updateState' *は常にコード内に0 *を返すので、実際には問題ありません。 – user7116

+0

@sixlettervariables thatsは真です。私は、彼が大文字小文字の枝で州を扱うためのコードの大部分を省略したと仮定しました。 break文もありません。しかし、私は彼のコードを読んだので、私は彼が参照によって現在の状態を渡すことを参照してください、多分議論がされている可能性があります。新しい状態を反映するように変更され、戻り値は別のものです。 –

+0

戻り値はどうすればよいですか? – user1261771

0

あなたのコードあなたが開始状態をチェックしません:

switch (state) { 
    case state1: /* ... */ 
    case state2: /* ... */ 
    case start : /* ... */ 
} 
関連する問題