写一个词法分析器
时间: 2024-02-13 19:01:32 浏览: 21
好的,我可以给你一个简单的词法分析器的代码示例,它可以将一个给定的字符串分解成单个的词汇单元:
```python
# 定义关键字列表
KEYWORDS = ['if', 'else', 'while', 'for', 'int', 'float', 'double']
# 定义符号列表
SYMBOLS = ['+', '-', '*', '/', '=', '<', '>', '(', ')', '{', '}', ';', ',']
# 分析函数
def lexer(code):
tokens = [] # 存储词汇单元的列表
i = 0 # 初始化字符串下标
while i < len(code):
c = code[i]
# 判断是否为关键字
if c.isalpha():
word = c
while i+1 < len(code) and code[i+1].isalnum():
word += code[i+1]
i += 1
if word in KEYWORDS:
tokens.append(('keyword', word))
else:
tokens.append(('identifier', word))
# 判断是否为数字
elif c.isdigit():
num = c
while i+1 < len(code) and code[i+1].isdigit():
num += code[i+1]
i += 1
if '.' in num:
tokens.append(('float', num))
else:
tokens.append(('integer', num))
# 判断是否为符号
elif c in SYMBOLS:
tokens.append(('symbol', c))
# 忽略空格
elif c.isspace():
pass
# 报错
else:
raise ValueError('Unknown character: {}'.format(c))
i += 1
return tokens
```
使用示例:
```python
code = 'if (a < b) { a = a + 1; } else { b = b + 1; }'
tokens = lexer(code)
print(tokens)
```
输出结果:
```
[('keyword', 'if'), ('symbol', '('), ('identifier', 'a'), ('symbol', '<'), ('identifier', 'b'), ('symbol', ')'), ('symbol', '{'), ('identifier', 'a'), ('symbol', '='), ('identifier', 'a'), ('symbol', '+'), ('integer', '1'), ('symbol', ';'), ('symbol', '}'), ('keyword', 'else'), ('symbol', '{'), ('identifier', 'b'), ('symbol', '='), ('identifier', 'b'), ('symbol', '+'), ('integer', '1'), ('symbol', ';'), ('symbol', '}')]
```
这个词法分析器可以处理简单的 C/C++ 代码,将代码分解成单个的词汇单元,方便后续进行语法分析和编译。