成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

MarvinZhang / 1008人閱讀

摘要:讀到一個(gè)非數(shù)字非英文字母非下劃線字符。此時(shí)立即跳轉(zhuǎn)回狀態(tài)。以一個(gè)雙引號(hào)開始,并以一個(gè)雙引號(hào)結(jié)束。另外,在讀和時(shí)源代碼不許結(jié)束,即讀到符號(hào),若結(jié)束,則判定為詞法錯(cuò)誤。對(duì)于而言,也有一些其他的詞法錯(cuò)誤判定,如,不能換行。

對(duì)于 Normal 狀態(tài),我只需要關(guān)心兩個(gè)過程:

何時(shí)從 Normal 跳轉(zhuǎn)到該狀態(tài)

何時(shí)從該狀態(tài)跳回 Normal 狀態(tài)。

在上一章中,我已經(jīng)寫好了從 Normal 狀態(tài)跳轉(zhuǎn)到各個(gè)其他狀態(tài)的代碼,這一章中,我將寫完所有非 Normal 狀態(tài)下對(duì)字符的處理代碼,以及跳回 Normal 狀態(tài)代碼。

首先是 Identifier 標(biāo)示符:

回顧上一章,Normal 狀態(tài)在何時(shí)會(huì)跳轉(zhuǎn)到 Identifier 狀態(tài)呢?

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

而身處 Identifier 狀態(tài)時(shí)。

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í),讀到數(shù)字、英文字母、下劃線時(shí),會(huì)跳轉(zhuǎn)到 Identifier 狀態(tài)。之后如果繼續(xù)讀數(shù)字、英語字母、下劃線,則會(huì)緩存這些字符,并繼續(xù)保持 Identifier 狀態(tài),直到:

讀到 “?”,“!” 這兩個(gè)只能用于 Identifier 結(jié)尾部分的字符,則立即創(chuàng)建一個(gè) Identifier 的 Token 并跳轉(zhuǎn)回 Normal 狀態(tài)。

讀到一個(gè)非數(shù)字、非英文字母、非下劃線字符。此時(shí)立即跳轉(zhuǎn)回 Normal 狀態(tài)。但不移動(dòng)游標(biāo),以便令處于 Normal 狀態(tài)下的代碼來判斷這個(gè)字符屬于什么樣的 Token。

然后是 Annotation 注釋:

回顧上一章,Normal 狀態(tài)何時(shí)跳轉(zhuǎn)到 Annotation 狀態(tài)呢?

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

處于 Annotation 狀態(tài)時(shí)的代碼如下。

else if(state == State.Annotation) {

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