2013-03-29 53 views
1

我正在寫一個詞法分析器。我有一個開關結構,這裏是該區域出現的代碼片段。Java開關結構不讀' n'

//whitespace 
    case ' ': 
    case '\t': 
    case '\n': 
     consume(); System.out.println("consumed ws"); 
     break; 

    //identifier 
    default: 
     if (isLetter()) { 
      consume(); 
      state = 8; 
     } else { 
      System.out.println("invalid character: " + look); 
     } 
     break; 

的問題是,雖然它會正確消耗空格和製表符,它不會消耗換行符,而是去爲默認值。

我與其他地方的'\ n'比較,他們工作正常。例如,如果某行已被註釋掉,代碼執行:

  case 10: 
       while(look != '\n'){ 
        consume(); 
       } 
       consume(); 
       state = 0; 
      break; 

如此看來,這只不過是一個錯誤,當它在開關結構,而不是if或while語句。但是,如果我在缺省情況下添加了一些處理換行符的內容,即使我打印出外觀,評估(look =='\ n')爲true,並且它在輸出中創建了一個新行。

+0

我認爲在Windows中換行符可能實際上是\ r \ n,但我不確定。 – w4etwetewtwet

+3

添加一個'case'\ r':'。 – sp00m

+0

錯誤實際發生了什麼文字?你是否嘗試過與另一個? – GameDroids

回答

2

您使用MS Windows嗎?如果是,則Windows中的結束行是\r\n。但在Linux中,你的程序應該沒問題。

您應該忽略\r字符,爲\r添加另一個情況,無需執行任何操作!

+0

但是然後交換機應該識別\ n並且忽略\ r ..不應該嗎? – GameDroids

+0

我不這麼認爲。它不會這樣做! – boomz

+0

但我會測試它,並讓你知道結果:)(等待幾分鐘!) – boomz

0

boomz答案是正確的。我只是在案件是'\ r'的地方添加了一個空格。

//whitespace 
    case ' ': 
    case '\t': 
    case '\r': 
    case '\n': 
     consume(); 
     break; 

請記住,所有的consume()函數都會得到另一個字符,所以在這裏沒有其他的事情要做。

謝謝。