2016-03-28 61 views
0

我正在嘗試使用Lexer來確定輸入是否包含String/Integer/Double/etc。我已經成功地確定了我是否正在處理除字符串之外的其他字符串,但是我無法確定如何處理字符串部分。確定Java中字符串的結尾

所以我們可以說我有三個輸入:

input = "\"asd\"" 
input2 = "\"The string \"String\" is really great\"5432" 
input3 = "\"The string \"String\" is really great\"5432"\One more\"" 

Expected output from: 
input = <STRING:asd> //Works with current code 
input2 = <STRING:The string "String" is really great><INTEGER 5432> //Broken 
input3 = <STRING:The string "String" is really great><INTEGER 5432> <STRING:One more>//ALSO BROKEN 

輸出處理等做工作,所以這不是問題,問題是處理字符串的結尾。 可以很容易地處理不包含引號字符串,這是目前我是如何處理它:

StringBuilder sb = new StringBuilder(); 
    int count = 1; 
    pos++; 
    current = input.charAt(pos); 
    boolean last = false; 
    char next = input.charAt(pos+1); 
    while (current != '"'){ 
     sb.append(current); 
     pos++; 
     current = input.charAt(pos); 
     next = input.charAt(pos+1); 
    } 
    tokens.add(new Token(TokenType.STRING,sb.toString())); 

現在,我的代碼,當第一引號出現在字符串出現的問題(見輸入2或輸入3例如)。我通過char檢查輸入字符,else-if分支是由引號開始確定的,這就是爲什麼有一個pos ++和當前更新(例如input2中的'T'字符)。

我如何確定字符串是否已結束(5432是input2中的整數而不是第一個字符串的部分)?

+0

您是否嘗試過使用'input.length'屬性來循環,直到達到您正在解析的字符串的長度? – Phoenix

+0

嗯,我可以做到這一點,但我不明白它可以如何幫助我。如果我有一個字符串「數字是」5324「」我如何確定它是一個字符串不是STRING,INTEGER,STRING。 – Banana

+0

爲什麼直接獲取你的字符串之間的函數'split()'有什麼不同?\t「char? – Phoenix

回答

0

因此,基本上按照Lexer的說法,從輸入3輸出STRING,INT,STRING在我的情況下是正確的,因爲使用標記\" doesen't只是剪切它,我不得不在字符串中創建一個引號標記,所以\\\"削減它:兩個反斜槓中的第一個將顯示一個反斜槓本身\和反斜槓和引號\"將顯示在字符串中的引號。顯示的字符串總共爲\",這只是引號的標記。