import re #正则表达式的库
#保留字,一共包含了c中的6个关键字
key_word = ['int','main','printf','return','whlie','if','scanf']
#运算符和界符
operator = ['(', ')', '{', '}', ',', ';', '"', '%', '&','+', '=', '>', '<', '-', '*' ]
bosy = ['>=','<=','==']
with open('cpp.txt', 'w') as file:
print("请输入需要进行词法分析的源程序:")
#txt = sys.stdin.readlines()
sentinel = '#' # 遇到这个就结束
lines = []
for line in iter(input, sentinel):
lines.append(line)
file.writelines(lines)
with open('cpp.txt', 'r') as file:
#预处理,增加了去除字符串的功能,毕竟字符串肯定不是标识符啊……
txt = ' '.join(file.readlines())
#在一个字符串中替换所有匹配正则表达式的子串,返回替换后的子串
#r代表原始字符串常量,用于处理正则表达式时,规避反斜杠的转义。
#re.sub 实现正则表达式的替换
##去除两边空格
deal_txt = txt.strip()
##替换制表符为空值
deal_txt = deal_txt.replace('\t', ' ').replace('\r', ' ').replace('\n', ' ')
#词法分析,标识符识别规则加入了_
keyword = []
opeword = []
boword = []
idword = []
numword = []
errword = []
#返回string(deal_txt)中所有与pattern(第一个变量)匹配的全部字符串,返回形式为数组。
pha = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', deal_txt)
num = re.findall(r'\d+',deal_txt)
str = re.findall(r'[^\w]', deal_txt)
bo = re.findall(r'>=|<=|==', deal_txt)
fnum=re.findall(r'\d+\.?\d*e?-?\d*?','5')
for k in pha:
if k in key_word:
keyword.append({k : key_word.index(k) + 1})
else:
#因为前面一共有关键字加函数一共有4个。
idword.append({k : 8})
for n in num:
numword.append({n : 9})
for s in str:
if s in operator:
opeword.append({s: len(key_word) + operator.index(s) + 3})
elif s != ' ':
errword.append({s : 'ERROR'})
for i in bo:
if i in bosy:
boword.append({i: len(key_word) + len(operator) +bosy.index(i) + 3})
print("保留字:\n", keyword)
print("标识符:\n", idword)
print("数字常量:\n", numword)
print("界符和操作符:\n", opeword+boword)
print("界符和操作符:\n", fnum)
if len(errword) != 0:
print("error:\n", 28)
python词法分析器
import re #正则表达式的库
#保留字,一共包含了...
生活中的经历