这是第一次在csdn上贴自己写的完整代码,希望可以帮到在校有缘人。
此代码是对从文本输入的程序字符串流进行分析,分别找出其中的关键字,常数,标识符,界符,运算符等。
注意:在这里当识别字符串的时候,由于利用了堆栈,因此,为了保证输出顺序与原来保持一致,采用逆序访问字符串的单个元素。
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 18 09:12:34 2019
@author: Administrator
"""
import numpy as np
class Stack(object):
"""栈"""
def __init__(self):
self.items = []
def is_empty(self):
"""判断是否为空"""
return self.items == []
def push(self, item):
"""加入元素"""
self.items.append(item)
def pop(self):
"""弹出元素"""
return self.items.pop()
def peek(self):
"""返回栈顶元素"""
return self.items[len(self.items)-1]
def size(self):
"""返回栈的大小"""
return len(self.items)
stack=Stack()
key_word=["int","double","float","void","char","while","if","else"]
jiefu_1=np.array([["左括号","("],["右括号",")"],["分号",";"],["双引号",'"'],["非","!"],["逗号",","],["赋值语句","="],
["加号","+"],["减号","-"],["乘号",'*'],["除号",'/'],["大左括号","{"],["大右括号","}"],["大于",'>'],
["小于","<"]])
jiefu_2=np.array([["大于等于",">="],["小于等于","<="],["等于","=="],["不等于","<>"]])
global flag
flag=0
def jiexi_speciality(first,second):
print("界符",second+first)
if(second+first in jiefu_2[:,1]):
global flag
flag=1
print(jiefu_2[jiefu_2[:,1]==second+first])
return
if(first in jiefu_1[:,1]):
print(jiefu_1[jiefu_1[:,1]==first])
return
print("未被识别的符号",first)
def get_kind():
v=''
while(not stack.is_empty()):
v+=stack.peek()
stack.pop()
if(v.isdigit()):
print("常数:",v)
else:
if v in key_word:
print("关键字",v)
else:
if(v!=''):
if(not v[0].isdigit()):
print("标识符",v)
else:
print("不合法的标识符",v)
def jiexi_word(word):
print("word:",word)
for index in range(len(word)):
if(word[::-1][index].isdigit() or word[::-1][index].isalpha()):
stack.push(word[::-1][index])
else:
get_kind()
global flag
if(flag==1):
flag=0
continue
if(index!=len(word)-1):
jiexi_speciality(word[::-1][index],word[::-1][index+1])
else:
jiexi_speciality(word[::-1][index],"")
if(not stack.is_empty()):
get_kind()
def read():
with open("C:/Users/Administrator/Desktop/新建文件夹/888.txt","r") as f:
lines=f.readlines()
for line in lines:
line=line.strip().split() #按照空格进行分割出每一个独立的字符串
print("当前一行:",line)
for word in line:
jiexi_word(word)
read()
如果有什么问题,欢迎大家多多指教