实验一 词法分析器的设计
一、实验目的
理解并掌握词法分析的原理与方法,能够使用某种语言实现词法分析程序。
二、实验要求
选用某种语言(如 C/C++)实现词法分析程序。词法分析程序的主要任务如下:
1. 识别出输入的源程序中的单词,输出二元组形式的单词序列。
2. 删除无用的空白字符、回车符等没有实质意义的字符。
3. 删除注释。
三、实验步骤
1. 选定进行词法分析的高级程序设计语言,给出该语言的文法。
<程序>::=<分程序>.
<分程序> ::=[<常量说明>][<变量说明>][<过程说明>]<语句>
<常量说明> ::=<常量定义>;
<常量定义> ::=<标识符>=<无符号整数>
<无符号整数> ::= <数字>{<数字>}
<变量说明> ::=<变量定义> <标识符>;
<变量定义> ::=char | string
<标识符> ::=<字母>{<字母>|<数字>}
<语句> ::=<赋值语句>|<条件语句>|<当循环语句>|<过程调用语句>
|<复合语句>|<读语句><写语句>|<空>
<赋值语句> ::=<标识符>:=<表达式>
<表达式> ::= [+|-]<项>{<加法运算符> <项>}
<项> ::= <因子>{<乘法运算符> <因子>}
<因子> ::= <标识符>|<无符号整数>| ‘(’<表达式>‘)’
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= =|<>|<|<=|>|>=
<条件语句> ::=if <条件> else <语句>
<当循环语句> ::= WHILE <条件> : <语句>
<字母> ::= a|b|…|X|Y|Z
<数字> ::= 0|1|…|8|9
2. 设计单词种别表。
1 基本字 :bool,char ,char[,class,double,false,float,getchar,include,int,long,main,null,open,printf, private,public,put,read,return,short,scanf,signed,static,stdio,string,struct,true, unsigned,void
2 标识符:Letter
3 常数:number
4 运算符 :*,-,/,=,>,<,>=,==,<=,%,+,+=,-=,*=,/=
5 界符:
'(',')',',',';','.','{','}','<','>','"'
__author__ = 'PythonStriker'
Operation=['*','-','/','=','>','<','>=','==','<=','%','+','+=','-=','*=','/='] #词法分析器中分别运算符
Delimiter=['(',')',',',';','.','{','}','<','>','"'] #词法分析器中分别界符
KeyWord=['bool','char' ,'char[','class','double','false','float','getchar','include','int','long','main','null','open','printf',
'private','public','put','read','return','short','scanf','signed','static','stdio','string','struct','true',
'unsigned','void']
LeftNoteFlag=0 #/*注释清除标记
RightNoteFlag=0 #*/注释清除标记
class Complier(): #封装成编译器
def IsLetter(self,Char):
if((Char>='a' and Char<='z') or( Char>='A' and Char<='Z')):
return True
else:
return False
def IsDigit(self,Char):
if(Char<='9' and Char>='0'):
return True
else:
return False
def IsSpace(self,Char):
if(Char==' '):
return True
else:
return False
def RemoveSpace(self,List): #清除字符串中前后的空格
indexInList=0
for String in List:
List[indexInList]=String.strip()
indexInList+=1
return List
def IsNote(self,String): #判断注释类型
global LeftNoteFlag
global RightNoteFlag
index=0
for Char in String:
if(index<len(String)):
index+=1
if(Char=='/'):
if(String[index]=='/'):
return 2
el