2012-03-13 84 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

是什麼開始的最初價值? – perreal 2012-03-13 16:50:11

+0

你最初的意思是什麼?你從cin獲得輸入。你的意思是0作爲第一個狀態? – user1261771 2012-03-13 16:52:35

+0

是的發佈代碼中未定義初始狀態啓動 – perreal 2012-03-13 16:54:20

回答

1

如果你想知道爲什麼stlist是全部爲0,看看return語句爲updateState

 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'的值,因爲他忘了改變它。 – 2012-03-13 17:00:25

+0

@MooingDuck:我假設*「做的東西;更新狀態」*覆蓋。如果他在代碼方面有問題,他沒有向我們展示,我無法幫助OP。 – user7116 2012-03-13 17:05:04

0

它看起來像你阿利斯調用updateState具有相同的值,開始。該值不在交換機中處理,因此該函數返回零。這意味着你只需要向stlist向量附加零。

嘗試處理交換機中的啓動狀態,並將updateState函數的返回值分配給cstate變量。

+0

它實際上並不重要,因爲'updateState' *在他的代碼中總是返回0 *。 – user7116 2012-03-13 16:55:14

+0

@sixlettervariables那是真的。我假定他省略了處理案例分支中狀態的大部分代碼。甚至沒有任何斷言。但是,現在我重讀了他的代碼,我發現他通過引用傳遞了當前狀態,所以也許這個論據應該是。修改以反映新狀態和返回值是另一回事。 – 2012-03-13 17:02:38

+0

那麼返回值應該是什麼? – user1261771 2012-03-13 17:17:36

0

你的代碼永遠不會檢查你開始狀態:

switch (state) { 
    case state1: /* ... */ 
    case state2: /* ... */ 
    case start : /* ... */ 
}