编译原理词法分析实验设计总控程序
时间: 2023-10-29 18:07:14 浏览: 134
以下是一个简单的编译原理词法分析实验设计总控程序的示例:
```python
# -*- coding: utf-8 -*-
import os
import sys
# 定义关键字列表
keywords = ['if', 'else', 'while', 'for', 'int', 'float', 'char', 'double', 'void']
# 定义符号列表
symbols = ['+', '-', '*', '/', '=', '<', '>', '(', ')', '[', ']', '{', '}', ';', ',', ':']
# 定义注释符号
comment_symbol = '//'
# 定义全局变量
line_number = 0 # 行号
current_line = '' # 当前行
# 定义 Token 类
class Token:
def __init__(self, token_type, value):
self.type = token_type
self.value = value
def __str__(self):
return f'Token({self.type}, {self.value})'
# 定义词法分析器
class Lexer:
def __init__(self, code):
self.code = code
self.pos = 0
def get_next_token(self):
global line_number, current_line
while self.pos < len(self.code):
# 跳过空白字符
if self.code[self.pos].isspace():
self.pos += 1
continue
# 处理数字类型的 Token
if self.code[self.pos].isdigit():
token_type = 'NUM'
value = ''
while self.pos < len(self.code) and (self.code[self.pos].isdigit() or self.code[self.pos] == '.'):
if self.code[self.pos] == '.':
if '.' in value:
print(f'Error: invalid number format at line {line_number}')
sys.exit()
value += self.code[self.pos]
self.pos += 1
return Token(token_type, value)
# 处理其他类型的 Token
token_type = ''
value = self.code[self.pos]
if value in symbols:
token_type = value
elif value.isalpha() or value == '_':
token_type = 'ID'
while self.pos < len(self.code) - 1 and (self.code[self.pos + 1].isalnum() or self.code[self.pos + 1] == '_'):
value += self.code[self.pos + 1]
self.pos += 1
if value in keywords:
token_type = 'KEYWORD'
elif value == comment_symbol:
self.pos = len(self.code)
continue
else:
print(f'Error: invalid character "{value}" at line {line_number}')
sys.exit()
self.pos += 1
return Token(token_type, value)
return Token('EOF', '')
# 定义测试函数
def test_lexer(lexer):
token = lexer.get_next_token()
while token.type != 'EOF':
print(token)
token = lexer.get_next_token()
# 定义主函数
def main():
global line_number, current_line
file_path = input('请输入要分析的文件路径:')
if not os.path.exists(file_path):
print(f'Error: file "{file_path}" does not exist')
sys.exit()
with open(file_path, 'r') as f:
for line in f.readlines():
line_number += 1
current_line = line.strip()
if current_line:
lexer = Lexer(current_line)
test_lexer(lexer)
print('词法分析结束')
if __name__ == '__main__':
main()
```
这个程序可以读取指定的文件,按行进行词法分析,并输出 Token 序列。其中,关键字列表、符号列表和注释符号可以根据需要进行修改。
阅读全文