摘要:讀到一個非數(shù)字非英文字母非下劃線字符。此時立即跳轉(zhuǎn)回狀態(tài)。以一個雙引號開始,并以一個雙引號結(jié)束。另外,在讀和時源代碼不許結(jié)束,即讀到符號,若結(jié)束,則判定為詞法錯誤。對于而言,也有一些其他的詞法錯誤判定,如,不能換行。
對于非 Normal 狀態(tài),我只需要關(guān)心兩個過程:
何時從 Normal 跳轉(zhuǎn)到該狀態(tài);
何時從該狀態(tài)跳回 Normal 狀態(tài)。
在上一章中,我已經(jīng)寫好了從 Normal 狀態(tài)跳轉(zhuǎn)到各個其他狀態(tài)的代碼,這一章中,我將寫完所有非 Normal 狀態(tài)下對字符的處理代碼,以及跳回 Normal 狀態(tài)代碼。
首先是 Identifier 標示符:回顧上一章,Normal 狀態(tài)在何時會跳轉(zhuǎn)到 Identifier 狀態(tài)呢?
if(state == State.Normal) { if(inIdentifierSetButNotRear(c)) { state = State.Identifier; } }
而身處 Identifier 狀態(tài)時。
else if(state == State.Identifier) { if(inIdentifierSetButNotRear(c)) { readBuffer.append(c); } else if(include(IdentifierRearSign, c)) { createType = Type.Identifier; readBuffer.append(c); state = State.Normal; } else { createType = Type.Identifier; state = State.Normal; moveCursor = false; } }
這段代碼用到了 IdentifierRearSign ,我它的定義貼在下面把。
private static final char[] IdentifierRearSign = new char[] {"?", "!"};
以上這段代碼表明。處于 Normal 狀態(tài)時,讀到數(shù)字、英文字母、下劃線時,會跳轉(zhuǎn)到 Identifier 狀態(tài)。之后如果繼續(xù)讀數(shù)字、英語字母、下劃線,則會緩存這些字符,并繼續(xù)保持 Identifier 狀態(tài),直到:
讀到 “?”,“!” 這兩個只能用于 Identifier 結(jié)尾部分的字符,則立即創(chuàng)建一個 Identifier 的 Token 并跳轉(zhuǎn)回 Normal 狀態(tài)。
讀到一個非數(shù)字、非英文字母、非下劃線字符。此時立即跳轉(zhuǎn)回 Normal 狀態(tài)。但不移動游標,以便令處于 Normal 狀態(tài)下的代碼來判斷這個字符屬于什么樣的 Token。
然后是 Annotation 注釋:回顧上一章,Normal 狀態(tài)何時跳轉(zhuǎn)到 Annotation 狀態(tài)呢?
if(state == State.Normal) { ... else if(c == "#") { state = State.Annotation; } } 處于 Annotation 狀態(tài)時的代碼如下。 else if(state == State.Annotation) { if(c != " " & c != "