编制一个能够分析整数、小数、标识符、主要运算符、主要关键字的词法分析器
时间: 2023-09-27 14:04:56 浏览: 58
好的,以下是一个简单的词法分析器的示例代码,可以分析整数、小数、标识符、主要运算符、主要关键字:
```python
import re
# 定义正则表达式
INTEGER_PATTERN = r'\d+'
FLOAT_PATTERN = r'\d*\.\d+'
IDENTIFIER_PATTERN = r'[a-zA-Z_][a-zA-Z0-9_]*'
OPERATOR_PATTERN = r'[+\-*/%=><!&|~^]'
KEYWORD_PATTERN = r'(if|else|while|for|do|break|continue|return|function|var)'
# 定义 Token 类
class Token:
def __init__(self, type, value):
self.type = type
self.value = value
def __str__(self):
return 'Token({type}, {value})'.format(
type=self.type,
value=repr(self.value)
)
# 定义 Lexer 类
class Lexer:
def __init__(self, text):
self.text = text
self.pos = 0
self.current_char = self.text[self.pos]
def error(self):
raise Exception('Invalid character')
def advance(self):
self.pos += 1
if self.pos >= len(self.text):
self.current_char = None
else:
self.current_char = self.text[self.pos]
def skip_whitespace(self):
while self.current_char is not None and self.current_char.isspace():
self.advance()
def integer(self):
result = ''
while self.current_char is not None and re.match(INTEGER_PATTERN, self.current_char):
result += self.current_char
self.advance()
return int(result)
def float(self):
result = ''
while self.current_char is not None and re.match(FLOAT_PATTERN, self.current_char):
result += self.current_char
self.advance()
return float(result)
def identifier(self):
result = ''
while self.current_char is not None and re.match(IDENTIFIER_PATTERN, self.current_char):
result += self.current_char
self.advance()
if result in KEYWORDS:
return Token(result.upper(), result)
else:
return Token('IDENTIFIER', result)
def operator(self):
result = self.current_char
self.advance()
if self.current_char is not None and re.match(OPERATOR_PATTERN, result + self.current_char):
result += self.current_char
self.advance()
return Token('OPERATOR', result)
def get_next_token(self):
while self.current_char is not None:
if self.current_char.isspace():
self.skip_whitespace()
continue
if re.match(INTEGER_PATTERN, self.current_char):
return Token('INTEGER', self.integer())
if re.match(FLOAT_PATTERN, self.current_char):
return Token('FLOAT', self.float())
if re.match(IDENTIFIER_PATTERN, self.current_char):
return self.identifier()
if re.match(OPERATOR_PATTERN, self.current_char):
return self.operator()
self.error()
return Token('EOF', None)
# 定义关键字
KEYWORDS = {
'if': 'IF',
'else': 'ELSE',
'while': 'WHILE',
'for': 'FOR',
'do': 'DO',
'break': 'BREAK',
'continue': 'CONTINUE',
'return': 'RETURN',
'function': 'FUNCTION',
'var': 'VAR',
}
# 测试代码
if __name__ == '__main__':
lexer = Lexer('3 + 4 * 2 - 1 / 5')
while True:
token = lexer.get_next_token()
if token.type == 'EOF':
break
print(token)
```
以上代码中,我们定义了几个正则表达式用于匹配整数、小数、标识符、主要运算符和主要关键字。我们还定义了一个 Token 类来存储词法分析器分析出来的 Token,以及一个 Lexer 类来实现词法分析器的逻辑。最后,我们测试了一下词法分析器的分析结果,输出了每个 Token 的类型和值。
你可以根据需要修改以上代码,添加更多的正则表达式来支持更多的语法规则。