Python中的词法分析器:使用lex()函数实现多种数据类型的识别
发布时间:2023-12-25 18:37:51
词法分析器(Lexer)是编译器或解释器中的一个重要组成部分,用于将源代码分割成多个词汇单元(Token)。在Python中,我们可以使用ply(Python Lex-Yacc)库来实现词法分析器。
ply库中的lex()函数是用于生成词法分析器的函数。下面是一个使用lex()函数实现多种数据类型识别的示例代码:
import ply.lex as lex
# 定义词法分析器的词汇规则
tokens = (
'INTEGER', # 整型
'FLOAT', # 浮点型
'STRING', # 字符串
'BOOL', # 布尔型
)
# 各个数据类型的匹配规则
def t_INTEGER(t):
r'\d+'
t.value = int(t.value)
return t
def t_FLOAT(t):
r'\d+\.\d+'
t.value = float(t.value)
return t
def t_STRING(t):
r'\"([^\\
]|(\\.))*?\"'
t.value = t.value[1:-1] # 去掉引号
return t
def t_BOOL(t):
r'True|False'
t.value = True if t.value == 'True' else False
return t
# 忽略空格和制表符
t_ignore = ' \t'
# 忽略注释
def t_COMMENT(t):
r'\#.*'
pass
# 错误处理
def t_error(t):
print("词法错误:非法字符 '%s'" % t.value[0])
t.lexer.skip(1)
# 创建词法分析器
lexer = lex.lex()
# 输入待识别的字符串
data = '''
age = 25
price = 10.5
name = "David"
is_student = True
'''
# 通过词法分析器逐个识别词汇单元
lexer.input(data)
while True:
token = lexer.token()
if not token:
break
print(token.type, token.value)
以上代码实现了对整型(INTEGER)、浮点型(FLOAT)、字符串(STRING)和布尔型(BOOL)的识别。在词法规则的定义中,我们使用了正则表达式来匹配各个数据类型的格式。
运行这段代码后,将输出以下结果:
INTEGER 25 FLOAT 10.5 STRING David BOOL True
这说明词法分析器成功识别出了数据类型,将其转换成对应的值。在实际应用中,我们可以根据需要修改词法规则来识别更多类型的数据。
