简单的词法分析器
在这个例子中,我将向你展示如何创建一个基本词法分析器,它将为
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', ';']]
正如你所看到的,我们所做的就是将一段源代码(如整数变量声明)转换为类型和值对令牌的令牌流。
让我们分解吧
-
我们从导入正则表达式库开始,因为在检查某些单词是否与某个正则表达式模式匹配时将需要它。
-
我们创建一个名为
tokens
的空列表。这将用于存储我们创建的所有令牌。 -
我们将源代码(一个字符串)拆分为一个单词列表,其中由空格分隔的字符串中的每个单词都是一个列表项。然后我们将它们存储在一个名为
source_code
的变量中。 -
我们开始逐字循环遍历我们的
source_code
列表。 -
我们现在进行第一次检查:
if word in ['str', 'int', 'bool']: tokens.append(['DATATYPE', word])
我们在这里检查的是一种数据类型,它将告诉我们变量的类型。
-
之后,我们执行更多检查,例如上面的检查,识别源代码中的每个单词并为其创建令牌。然后将这些标记传递给解析器以创建抽象语法树(AST)。
如果你想与这个代码交互并使用它,这里是一个链接到在线编译器中的代码 https://repl.it/J9Hj/latest