简单的解析器

这是一个简单的解析器,它将解析我们在前面的示例 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