Python中的词法分析器:利用lex()函数进行关键字提取
发布时间:2023-12-25 18:34:36
词法分析器(Lexical analyzer)是编译器的一部分,用于将输入的源代码分解为一个个的词法单元(token)。在Python中,我们可以使用内置的lex()函数来实现词法分析。
1. 导入所需的模块和库:
import ply.lex as lex
2. 定义词法分析器的词法单元:
tokens = [
'KEYWORD',
'IDENTIFIER',
'NUMBER',
'STRING',
'OPERATOR',
]
3. 定义词法单元的正则表达式模式:
# 定义关键字
keywords = {
'if': 'IF',
'else': 'ELSE',
'for': 'FOR',
'while': 'WHILE'
}
# 定义操作符
operators = {
'==': 'EQUAL',
'>': 'GREATER',
'<': 'LESS',
'=': 'ASSIGN'
}
# 定义识别模式
t_STRING = r'\".*?\"'
t_OPERATOR = r'==|>|<|='
def t_KEYWORD(t):
r'\bif\b|\belse\b|\bfor\b|\bwhile\b'
t.type = keywords.get(t.value, 'IDENTIFIER')
return t
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
def t_IDENTIFIER(t):
r'[a-zA-Z_][a-zA-Z0-9_]*'
t.type = keywords.get(t.value, 'IDENTIFIER')
return t
t_ignore = ' \t
'
4. 构建词法分析器:
lexer = lex.lex()
5. 输入源代码,进行词法分析:
source_code = '''
if x == 5:
print("Hello, World!")
else:
print("Goodbye, World!")
'''
lexer.input(source_code)
while True:
token = lexer.token()
if token is None:
break
print(token)
以上代码中,首先定义了一些词法单元,包括关键字、标识符、数字、字符串和操作符。然后使用ply.lex库中的lex()函数创建了一个词法分析器。接着输入待分析的源代码,通过lexer.token()函数逐个获取词法单元。输出结果将会是一个个的词法单元,包括类型(type)和值(value)。
运行以上代码,将会输出如下结果:
LexToken(IF,'if',1,1)
LexToken(IDENTIFIER,'x',1,4)
LexToken(EQUAL,'==',1,6)
LexToken(NUMBER,5,1,9)
LexToken(':',':',1,10)
LexToken(STRING,'"Hello, World!"',2,5)
LexToken(ELSE,'else',3,1)
LexToken(':',':',3,6)
LexToken(STRING,'"Goodbye, World!"',4,5)
以上就是使用Python中的lex()函数进行词法分析的基本步骤和示例。通过词法分析器可以将源代码分解为词法单元,为语法分析提供基础。
