用python写一个词法分析器,不能用正则表达式
时间: 2024-10-25 16:04:04 浏览: 7
C#词法分析器之正则表达式的使用
在Python中编写词法分析器而不使用正则表达式,可以采用自定义的有限状态自动机(Finite State Automaton,FSA)或者手写一些基础的文本处理逻辑。下面是一个简单的例子,我们将创建一个分析英文单词的基本词法分析器:
```python
class Lexer:
def __init__(self):
self.current_char = None
self.tokens = []
def tokenize(self, text):
for char in text:
if self.is_whitespace(char): # 空白字符
continue
elif self.is_alpha(char): # 单词字符
self.current_word += char
elif self.current_word: # 如果当前正在构造单词
self.tokens.append(('word', self.current_word))
self.current_word = ''
elif self.is_digit(char): # 数字字符
self.current_number += char
while self.is_digit(text[self.index]): # 遇到连续的数字字符
self.current_number += text[self.index]
self.index += 1
elif self.is_punctuation(char): # 符号
self.tokens.append(('symbol', char))
# 处理最后可能的单词或数字
if self.current_word:
self.tokens.append(('word', self.current_word))
if self.current_number:
self.tokens.append(('number', self.current_number))
# 辅助函数,判断字符类型
def is_whitespace(self, char):
return char.isspace()
def is_alpha(self, char):
return char.isalpha()
def is_digit(self, char):
return char.isdigit()
def is_punctuation(self, char):
return char in string.punctuation
# 使用示例
lexer = Lexer()
text = "Hello, 123! This is a test."
tokens = lexer.tokenize(text)
for token in tokens:
print(f"{token[0]}: {token[1]}")
阅读全文