python实现 编译原理上机实验试题

该实验旨在让学生深入理解程序设计语言的词法和语法分析,通过Python实现有限状态自动机进行词法分析,并采用算符优先分析方法进行语法分析。实验包括编写程序,完成对特定文法的词法和语法分析,并在计算中处理常量和标识符。
摘要由CSDN通过智能技术生成

编写的比较简单:

一、实验目的

          通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术,如何针对确定的有限状态自动机进行编程序;熟悉和掌握程序设计语言的语法分析程序的设计原理、熟悉和掌握算符优先分析方法。

二、实验要求

          本实验要求:①要求能熟练使用一种程序设计语言编程;②在上机之前要有详细的设计报告(预习报告);③要编写出完成相应任务的程序并在计算机上准确地运行;④实验结束后要写出上机实验报告。

三、实验题目

          针对下面文法G(S):

S→ v = E

E→E+E│E-E│E*E│E/E│(E)│ v │ i

       其中,v为标识符,i为整型或实型数。要求完成

      ① 使用自动机技术实现一个词法分析程序;

KW={'var':1,'int':2,'#':3,'=':4,'+':5,'-':6,'*':7,'/':8,'(':9,')':10}#var=>标识符 int=>数字 #=>结束标记
words=input('输入语句:')
index=0
flag=1
if(words[-1] != '#'):
    print("error:输入表达式应以#结尾!")
    flag=0
while(index+1<len(words) and flag==1):
    ch=words[index]
    if(ord(ch) in range(ord('a'),ord('z')+1) or ord(ch) in range(ord('A'),ord('Z')+1)):
        #该字符为字母
        Crs=ch
        if(ord(words[index+1]) not in range(ord('a'),ord('z')+1) and ord(words[index+1]) not in range(ord('A'),ord('Z')+1)):
            if(Crs in KW.keys()):
                print('({},\'{}\')'.format(KW[Crs],Crs))
                index+=1
            else:
                print('({},\'{}\')'.format(1,Crs))
                index+=1
        else:
            while(ord(words[index+1]) in range(ord('a'),ord('z')+1) or ord(words[index+1]) in range(ord('A'),ord('Z')+1)):
                Crs=Crs+words[index+1]
                index+=1
                if(words[index+1]=='#' or ord(words[index+1]) not in range(ord('a'),ord('z')+1) and ord(words[index+1]) not in range(ord('A'),ord('Z')+1)):
                    if(Crs in KW.keys()):
                        print('({},\'{}\')'.format(KW[Crs],Crs))
                        index+=1
                        break
                    else:
                        print('({},\'{}\')'.format(1,Crs))
                        index+=1
                        break
    elif(ch==' '):
        #该字符为空格
        while(words[index+1]==' '):
            index+=1
        index+=1
    elif(ch in ['=','+','-','*','/','(',')']):
        #该字符为运算符
        index+=1
        print('({},\'{}\')'.format(KW[ch],ch))
    elif(ch in ['0','1','2','3','4','5','6','7','8','9']):
        #该字符为数字
        num=ch
        while(words[index+1] in ['0','1','2','3','4','5','6','7','8','9']):
            num=num+words[index+1]
            index+=1
        index+=1
        print('({},{})'.format(2,num))
    if(words[index]=='#'):
        print('(3,\'#\')')
        break
#输入:#结尾的算符表达式

      效果:

② 使用算符优先分析方法实现其语法分析程序;

OPE={                                                       #操作符优先级字典
    '+':{'+':'>','-':'>','*':'<','/':'<','(':'<',')':'>','#':'>'},
    '-':{'+':'>','-':'>','*':'<','/':'<','(':'<',')':'>','#':'>'},
    '*':{'+':'>','-':'>','*':'>','/':'>','(':'<',')':'>','#':'>'},
    '/':{'+':'>','-':'>','*':'>','/':'>','(':'<',')':'>','#':'>'},
    '(':{'+':'<','-':'<','*':'<','/':'<','(':'<',')':'=','#':'err'},
    ')':{'+':'>','-':'>','*':'>','/':'>','(':'err',')':'>','#':'>'},
    '#':{'+':'<',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值