利用Pyhthon实现语法分析器(实验报告)

本次实验使用Python设计并实现了词法分析子程序,旨在理解语法分析原理,并能实际编写语法分析器。实验中,将C语言单词符号分为关键字、运算符和界符三类,通过对输入序列的分析,判断其是否符合语法规则,并记录语法错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

本次实验通过用python语言,设计,编制,调试一个词法分析子程序,识别单词,实现一个python语法分析器,经过此过程可以加深对编译器解释的过程。

1.1.实验目的

理解并掌握语法分析的原理与方法,能够使用某种语言实现语法分析程序。

1.2.实验描述

本实验中将C语言单词符号分为三类:关键字,运算符,界符,将关键字初始在KeyWord列表中,将界符初始在KeyAmbit列表中,将运算符初始在KeySimple列表中。因此,从原文件字符串中识别出关键字,界符,运算符只能从中选取,其他的可以归类为变量,数字,格式变量,格式符,存放到列表中,字典存放这些变量的位置,方便确认报错位置。

1.3.实验要求

1.输入词法分析输出的单词序列,判断单词序列构成的程序是否符合语法语法规则。

  2.记录语法错误信息,统一输出错误信息。

2.实验内容

2.1.实验代码


__author__='PythonStriker'
KeySimple=['*','-','/','=','>','<','>=','==','<=','%','+','+=','-=','*=','/=']                                                                       #词法分析器中分别运算符
KeyAmbit=['(',')',',',';','.','{','}','<','>','"','[',']',"'"]                                                                                                   #词法分析器中分别界符
KeyWord=[ 'bool','char' ,'char[','class','define','double','false','float','getchar','include','int','iostream','long','main','null','open','printf',
          'private','public','put','read','return','short','scanf','signed','static','stdio','string','struct','true',
          'unsigned','void']
TypeKeyWord=['int','long','unsign','double','float','string','struct','char','void','bool','class','short']                                          #语法分析定义类型

FunctionKeyWord=['getchar','open','printf','put','read','return','scanf','main']                                           #语法分析功能类型
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SourceProgram=[]                                                                                                    #存放源程序代码
DeleteNote_SourceProgram=[]                                                                                         #存放去除注释源程序代码
Reader_SourceProgram=[]                                                                                             #存放类型判断后源程序
WordPositionList=[]                                                                                                 #存放单词位置信息
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ErrorList={}                                                                                                        #语法分析器错误储存报表(存储报错位置和类型)
WordType={}                                                                                                         #词法类型字典
WordPosition={}                                                                                                     #定位关键字位置
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Filepath=''                                                                                                         #存放文件路径
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LeftNoteFlag=0                                                                                                      #/*注释清除标记
RightNoteFlag=0                                                                                                     #*/注释清除标记
LeftBracketNumber=0                                                                                                 #成对界符的左标记 
RighBracketNumber=0                                                                                                 #成对界符的右标记
NumberInString=0                                                                                                    #String中的下标
NumberinList=0                                                                                                      #List中的下标
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

class Assembly():                                                                                                   #封装成编译器
    def IsLetter(self,Char):
         if((Char<='z' and Char>='a') or( Char<='Z' and Char>='A') or Char=='_'):
                return True
         else:
                return False

    def IsNote(self,String):            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值