编译原理词法分析程序

这是第一次在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()





如果有什么问题,欢迎大家多多指教 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值