简单的词法分析器

在这个例子中,我将向你展示如何创建一个基本词法分析器,它将为 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