请使用C、C++、JAVA或Python任一编程语言,编写一个词法分析器。输入一段程序,该词法分析器能够识别关键字,分隔符,运算符,标识符以及常量等单词
时间: 2024-10-23 18:16:33 浏览: 54
词法分析器通常是编译器或解释器的重要组成部分,它负责将源代码分解成一系列更小的有意义的单元,也就是所谓的令牌。这里以Python为例,因为它的简洁语法易于理解和示例化。我们将创建一个简单的词法分析器,利用内置的正则表达式库`re`。
```python
import re
class Lexer:
keywords = {
'if', 'else', 'for', 'while', 'def', 'int', 'float', 'str',
# 更多关键词...
}
token_patterns = [
(r'\b(if|else|for|while|def|int|float|str)\b', 'keyword'),
(r'[0-9]+(\.[0-9]+)?', 'number'), # 整数和浮点数
(r'\b[a-zA-Z_][a-zA-Z_0-9]*\b', 'identifier'), # 标识符
(r'\s+', 'space'), # 空格和换行符
(r'[+\-\*/%]', 'operator'), # 运算符
(r'"([^"]*)"', 'string'), # 字符串
(r"'([^']*)'", 'string'), # 单引号字符串
(r'\(', 'lparen'),
(r'\)', 'rparen'),
(r'\[', 'lbracket'),
(r'\]', 'rbracket'),
(r';', 'semicolon'),
]
def __init__(self, text):
self.text = text
self.pos = 0
self.current_char = None
def advance(self):
if self.pos < len(self.text):
self.current_char = self.text[self.pos]
self.pos += 1
else:
self.current_char = None
def get_next_token(self):
while self.current_char is not None:
for pattern, tok_type in self.token_patterns:
match = re.match(pattern, self.current_char)
if match:
yield tok_type, match.group(0) # 返回当前匹配的词法单元
break
else:
self.advance() # 如果所有模式都不匹配,移动到下一个字符
yield 'eof', '' # 当遍历完文本后,返回结束标记
# 使用示例
lexer = Lexer("int x = 5; if (x > 0) { print('Hello, World!') }")
tokens = list(lexer.get_next_token())
```
这个简单的词法分析器只能处理一些基本的结构,实际项目中会更复杂,并可能需要处理更多边缘情况和错误处理。
阅读全文