簡單的解析器

這是一個簡單的解析器,它將解析我們在前面的示例 Simple Lexical Analyzer 中建立的整數變數宣告令牌流。此解析器也將以 python 編碼。

什麼是解析器?

解析器是將源文字轉換為抽象語法樹(AST)的過程。它還負責執行語義驗證,這些驗證除去了無意義的語法正確的語句,例如無法訪問的程式碼或重複的宣告。

示例代幣:

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

‘python3’中解析器的程式碼:

ast = { 'VariableDecleration': [] }

tokens = [ ['DATATYPE', 'int'], ['IDENTIFIER', 'result'], ['OPERATOR', '='],  
           ['INTEGER', '100'], ['END_STATEMENT', ';'] ]
           
# Loop through the tokens and form ast
for x in range(0, len(tokens)):
    
    # Create variable for type and value for readability
    token_type  = tokens[x][0]
    token_value = tokens[x][1]
    
    # This will check for the end statement which means the end of var decl
    if token_type == 'END_STATEMENT': break
    
    # This will check for the datatype which should be at the first token
    if x == 0 and token_type == 'DATATYPE':
        ast['VariableDecleration'].append( {'type': token_value} )
    
    # This will check for the name which should be at the second token
    if x == 1 and token_type == 'IDENTIFIER':
        ast['VariableDecleration'].append( {'name': token_value} )
        
    # This will check to make sure the equals operator is there
    if x == 2 and token_value == '=': pass
    
    # This will check for the value which should be at the third token    
    if x == 3 and token_type == 'INTEGER' or token_type == 'STRING':
        ast['VariableDecleration'].append( {'value': token_value} )
        
print(ast)

以下程式碼應該輸出結果:

{'VariableDecleration': [{'type': 'int'}, {'name': 'result'}, {'value': '100'}]}

正如你所看到的,解析器所做的一切都來自原始碼標記,它找到了變數宣告的模式(在本例中)並建立了一個包含它的物件,該物件儲存了 typenamevalue 等屬性。

讓我們分解吧

  1. 我們建立了 ast 變數,它將儲存完整的 AST。

  2. 我們建立了示例 token 變數,它包含由我們的詞法分析器建立的標記,現在需要對其進行解析。

  3. 接下來,我們遍歷每個令牌並執行一些檢查以找到某些令牌並與它們形成我們的 AST。

  4. 我們為型別和值建立變數以提高可讀性

  5. 我們現在執行這樣的檢查:

    if x == 0 and token_type == 'DATATYPE':
         ast['VariableDecleration'].append( {'type': token_value} )
    

    它查詢資料型別並將其新增到 AST。我們繼續為值和名稱執行此操作,這將導致完整的 VariableDecleration AST。

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