国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從零開始寫個編譯器吧 - 開始寫詞法分析器(2)

MarvinZhang / 850人閱讀

摘要:讀到一個非數字非英文字母非下劃線字符。此時立即跳轉回狀態。以一個雙引號開始,并以一個雙引號結束。另外,在讀和時源代碼不許結束,即讀到符號,若結束,則判定為詞法錯誤。對于而言,也有一些其他的詞法錯誤判定,如,不能換行。

對于 Normal 狀態,我只需要關心兩個過程:

何時從 Normal 跳轉到該狀態;

何時從該狀態跳回 Normal 狀態。

在上一章中,我已經寫好了從 Normal 狀態跳轉到各個其他狀態的代碼,這一章中,我將寫完所有非 Normal 狀態下對字符的處理代碼,以及跳回 Normal 狀態代碼。

首先是 Identifier 標示符:

回顧上一章,Normal 狀態在何時會跳轉到 Identifier 狀態呢?

if(state == State.Normal) {
    if(inIdentifierSetButNotRear(c)) {
        state = State.Identifier;
    }
}

而身處 Identifier 狀態時。

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 狀態時,讀到數字、英文字母、下劃線時,會跳轉到 Identifier 狀態。之后如果繼續讀數字、英語字母、下劃線,則會緩存這些字符,并繼續保持 Identifier 狀態,直到:

讀到 “?”,“!” 這兩個只能用于 Identifier 結尾部分的字符,則立即創建一個 Identifier 的 Token 并跳轉回 Normal 狀態。

讀到一個非數字、非英文字母、非下劃線字符。此時立即跳轉回 Normal 狀態。但不移動游標,以便令處于 Normal 狀態下的代碼來判斷這個字符屬于什么樣的 Token。

然后是 Annotation 注釋:

回顧上一章,Normal 狀態何時跳轉到 Annotation 狀態呢?

if(state == State.Normal) {
    ...
    else if(c == "#") {
        state = State.Annotation;
    }
}

處于 Annotation 狀態時的代碼如下。

else if(state == State.Annotation) {

    if(c != "
" & c != "