python等縮排語言的詞法分析實現

來源:互聯網
上載者:User

python等縮排語言的詞法分析實現:

定義兩個虛擬Token:

tokens {
    INDENT;
    DEDENT;
}

還有一個縮排棧,用於確定是縮排一行,還是回退一行:
Stack<Integer> _indentStack = new Stack<Integer>();

在開始做詞法分析之前,壓入一個預設的Indent,這一步其實沒什麼必要,只是用來避免寫判斷棧頂是否為空白的冗餘判斷:
_indentStack = new Stack<Integer>();
_indentStack.push(new Integer(0));

針對每一個新行,首先判斷行首是否是空格,如果是空格,則空格計1、Tab鍵計8個空格,如果僅僅是空行,跳過。如果在碰到行尾之前碰有非Null 字元,則將空格數與棧頂的空格對比,如果大於,壓入當前行的空格數,並產生一個虛擬Indent Token,如果小於,將所有空格數大於當前行的出棧,並產生一個虛擬Dedent Token:

NEWLINE
@init {
    int spaces = 0;
}
    :   ((('\u000C')?('\r')? '\n' ) | '\t' | ' ')* (('\u000C')?('\r')? '\n')
        leading_space = (' ' { spaces++; } | '\t' { spaces += 8; spaces -= (spaces \% 8); })*
        {
            if ( !_inATable &&
                 (getCharPositionInLine() == 0 ||
                  implicitLineJoiningLevel > 0) ) {
                emit(new ClassicToken(NEWLINE, this.getText(), HIDDEN));
            } else {
                emit(new ClassicToken(NEWLINE, this.getText(), HIDDEN));
            }

            if ( implicitLineJoiningLevel == 0 &&
                 _indentStack.size() > 0) {
                if (spaces > _indentStack.peek().intValue() ) {
                    _indentStack.push(new Integer(spaces));                   
                    emit(new ClassicToken(INDENT, ">"));
                }
                else {
                    while ( spaces < _indentStack.peek().intValue() ) {
                        _indentStack.pop();
                        emit(new ClassicToken(DEDENT, "<"));
                    }
                }
            }
        }
    | ((('\u000C')?('\r')? '\n' ) | '\t' | ' ')* (('\u000C')?('\r')? '\n')
      (' ' | '\t')* '#' (~'\n')*
        {
            $channel = HIDDEN;
        }
    ;

當然還要考慮純注釋行,和空格後僅跟有注釋的情形。

這樣詞法分析過程中,縮排的詞法分析過程就完了,在文法分析中,Indent是透明的,例如:

compound_stmt
    : IF compound_condition (suite)+ elif_clause* else_clause?
    | assignment
    ;

suite
    : INDENT (compound_stmt)+ (DEDENT | EOF)
    ;

上面的文法中,INDENT和DEDENT就跟括弧的處理沒什麼區別,只不過DEDENT可選,主要是考慮直接在代碼後就EOF的情況。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.