2013-03-19 52 views
0

我已經編寫了一個允許從中綴到後綴表達式的程序,但它只能用於一個數字[A-Z][a-z][0-9]。我該如何做才能讓真正的(正面和負面)數字成爲可能?向後綴添加真實(正數和負數)

Example: (50 + 3.75) + 50 --> 50 3.75 + 50 + 

doTrans(),其允許從綴翻譯與postfix

public String doTrans() { 
     for (int j = 0; j < input.length(); j++) { 
      char ch = input.charAt(j); 
      theStack.displayStack("For " + ch + " "); 
      switch (ch) { 
      case '+': 
      case '-': 
       gotOper(ch, 1); 
       break; 
      case '*': 
      case '/': 
       gotOper(ch, 2); 
       break; 
      case '(': 
       theStack.push(ch); 
       break; 
      case ')': 
       gotParen(ch); 
       break; 
      default: 
       output = output + ch; 
       break; 
      } 
     } 
     while (!theStack.isEmpty()) { 
      theStack.displayStack("While "); 
      output = output + theStack.pop(); 
     } 
     theStack.displayStack("End "); 
     return output; 
    } 

的問題在這條線output = output + ch;。我無法找到一個解決方案,如何獲得整個數字而不是隻有一個數字

+0

你可以發佈你的代碼嗎? – 2013-03-19 20:24:44

+1

改變它的工作方式。 – 2013-03-19 20:24:56

+0

這不是代碼問題。我無法找到一個主意! – mpluse 2013-03-19 20:27:02

回答

1

您必須做一個Lexical analysis。您必須將輸入流轉換爲令牌並對它們進行分類。目前你的程序已經做了,但它非常非常基本,那麼你的代碼只包含一個數字。雖然令牌可能更復雜,從大於9的簡單整數數字文字開始,浮點數字符,字符串文字,簡單的運算符等等。

你現在可能擁有的東西是讓你在隨後的調用中分析下一個令牌來處理它並進入下一個令牌。是這樣的:

String input = "1 + 2"; 
int actPos = 0 ; 

.... 

char getNextToken() { 
    return input.charAt(actPos++); 
} 

你需要做的就是重寫getNextToken()所以,它給你一個「複雜的」令牌回(由一個以上的數字/字符,從而字符串)巫婆,你必須分類在下一步。

String getNextToken() { 
    String StringBuilder token = new StirngBuilde(); 

    // extract the next token from the input stream 
    // using a state automata witch comes to a final 
    // state when a token was recognized or an erroneous input 

    return token.toString(); 
} 

EIDT

你需要寫finite state machine分析輸入流併產生令牌。

只是給你一個非常簡單的例子(假設你已經閱讀了上面鏈接中的定義),假設你有字母{'0','1','2','3','4','5','6','7','8','9'}並且想要構建沒有符號的整數的標記。您可以定義整數[0-9]+

你的狀態機至少需要三個州START女巫是啓動狀態,INTEGER女巫最終接受狀態,ERROR巫婆表示有輸入錯誤。

現在您需要一個轉換函數和一個state transition table,這是根據實際狀態獲取實際輸入併產生下一個狀態的內容。

的狀態轉換表可能看起來類似的東西(很基本的,沒有給出輸入時無法處理)

   i n p u t 
       +----------+----------+ 
       | [0-9] | else  | 
s +----------+----------+----------+ 
t | START | INTEGER | ERROR | 
a +----------+----------+----------+ 
t | INTEGER | INTEGER | ERROR | 
e +----------+----------+----------+ 
    | ERROR | ERROR | ERROR | 
    +----------+----------+----------+ 

所以我們可以說你有以下輸入:27

  • 在開始狀態機的狀態爲START(實際狀態)
  • 您讀取第一個字符2,並將其與實際狀態一起傳遞給轉換函數
  • 由於2是一個整數,因此您的函數會將您帶入狀態INTEGER,並且由於這不是ERROR,所以您將它放在緩衝區中,並通過char構建標記char。
  • 現在您讀取下一個字符7,並將其與實際狀態INTEGER一起傳遞給轉換函數。
  • 7也是一個整數,同樣的事情發生在2
  • 現在令牌緩衝區的內容爲27,並且您的狀態機仍處於狀態INTEGER女巫爲接受狀態且沒有剩餘輸入。此時您可以返回令牌緩衝區的內容作爲下一個令牌。

現在假設你有輸入:2e7

你的狀態機繼續像上面的第一個字符2和國家INTEGER,然後是e巫不符合上述定義的整數規則( [0-9]+)。通過e與實際狀態INTEGER到轉換函數導致轉換狀態ERROR。此時您可以通知位置/索引e處的輸入存在錯誤。

我的建議是,你閱讀了更多關於詞法分析以及如何編寫一個有限狀態機來實現它。

這就是說,你總是可以使用一些工具,如JLex爲你生成這個分析代碼,但你仍然必須定義一些規則來生成你想做它的代碼,女巫會帶你回到閱讀更多關於詞法分析:)

祝你好運!

+0

你能解釋一下嗎? – mpluse 2013-03-19 21:27:53

+0

@Khan抱歉,昨天沒有通知編輯:/ – A4L 2013-03-21 23:02:33