簡單的詞法分析器

在這個例子中,我將向你展示如何建立一個基本詞法分析器,它將為 python 中的整數變數宣告建立標記。

詞法分析器有什麼作用?

詞法分析器(詞法分析器)的目的是掃描原始碼並將每個單詞分解為列表項。一旦完成它需要這些單詞並建立一個型別和值對,看起來像這個 ['INTEGER', '178'] 形成一個令牌。

建立這些標記是為了識別你的語言的語法,因此詞法分析器的重點是建立語言的語法,因為它取決於你想要如何識別和解釋不同的專案。

此詞法分析器的示例原始碼:

int result = 100;

python 中的詞法分析器程式碼:

import re                                 # for performing regex expressions

tokens = []                               # for string tokens
source_code = 'int result = 100;'.split() # turning source code into list of words

# Loop through each source code word
for word in source_code:
    
    # This will check if a token has datatype decleration
    if word in ['str', 'int', 'bool']: 
        tokens.append(['DATATYPE', word])
    
    # This will look for an identifier which would be just a word
    elif re.match("[a-z]", word) or re.match("[A-Z]", word):
        tokens.append(['IDENTIFIER', word])
    
    # This will look for an operator
    elif word in '*-/+%=':
        tokens.append(['OPERATOR', word])
    
    # This will look for integer items and cast them as a number
    elif re.match(".[0-9]", word):
        if word[len(word) - 1] == ';': 
            tokens.append(["INTEGER", word[:-1]])
            tokens.append(['END_STATEMENT', ';'])
        else: 
            tokens.append(["INTEGER", word])

print(tokens) # Outputs the token array

執行此程式碼段時,輸出應如下所示:

[['DATATYPE', 'int'], ['IDENTIFIER', 'result'], ['OPERATOR', '='], ['INTEGER', '100'], ['END_STATEMENT', ';']]

正如你所看到的,我們所做的就是將一段原始碼(如整數變數宣告)轉換為型別和值對令牌的令牌流。

讓我們分解吧

  1. 我們從匯入正規表示式庫開始,因為在檢查某些單詞是否與某個正規表示式模式匹配時將需要它。

  2. 我們建立一個名為 tokens 的空列表。這將用於儲存我們建立的所有令牌。

  3. 我們將原始碼(一個字串)拆分為一個單詞列表,其中由空格分隔的字串中的每個單詞都是一個列表項。然後我們將它們儲存在一個名為 source_code 的變數中。

  4. 我們開始逐字迴圈遍歷我們的 source_code 列表。

  5. 我們現在進行第一次檢查:

    if word in ['str', 'int', 'bool']: 
       tokens.append(['DATATYPE', word])
    

    我們在這裡檢查的是一種資料型別,它將告訴我們變數的型別。

  6. 之後,我們執行更多檢查,例如上面的檢查,識別原始碼中的每個單詞併為其建立令牌。然後將這些標記傳遞給解析器以建立抽象語法樹(AST)。

如果你想與這個程式碼互動並使用它,這裡是一個連結到線上編譯器中的程式碼 https://repl.it/J9Hj/latest