词法分析器的构造 南邮编译原理实验一报告文档格式.docx
《词法分析器的构造 南邮编译原理实验一报告文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析器的构造 南邮编译原理实验一报告文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
1)、允许用户自己输入源程序并保存为文件;
2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等);
3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。
定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:
识别保留字:
if、int、for、while、do、return、break、continue等,其他的都识别为标识符;
常数为无符号整形数;
运算符包括:
+、-、*、/、=、>
、<
、>
=、<
=、!
=等;
分隔符包括:
、;
、{、}、(、)等;
4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。
文本内容为待分析的类C语言程序。
二、实验环境(实验设备)
硬件:
计算机
软件:
VisualC++6.0
二、实验原理及内容
1、实验内容:
设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。
例如下面为一段C语言源程序:
main(){
int
a,b;
a=10;
b=a+20;
}
要求输出如下:
(2,’main’)
(5,’(’)
(5,’)’)
(5,’)’)
(5,’{’)
(1,’int’)
(2,’a’)
(5,’,’)
(2,’b’)
(5,’;
’)
(4,’=’)
(3,’10’)
(4,’+’)
(3,’20’)
(5,’}’)
2、实验原理状态转换图
3、实验代码:
实验代码:
#include<
string.h>
iostream.h>
fstream>
#include<
stdlib.h>
stdio.h>
ctype.h>
structChar{//创建一个结构用于存贮关键字
chara[15];
};
typedefstructCharCH;
//定义关键字
CHkeyWord[67]={"
auto"
"
break"
case"
cout"
cin"
char"
const"
continue"
default"
"
do"
double"
else"
enum"
endl"
extern"
float"
for"
goto"
if"
main"
include"
int"
long"
register"
return"
short"
signed"
sizeof"
static"
string"
struct"
switch"
typedef"
union"
unsigned"
void"
stdio"
while"
catch"
calss"
ctype"
stdlib"
fstream"
export"
iostream"
false"
friend"
inline"
mutable"
namespace"
new"
operator"
private"
protected"
public"
static_cast"
template"
this"
throw"
true"
try"
typename"
using"
virtual"
asm"
//检测是否为数字,是返回true,否则返回false
boolIsDigit(charA){
if(A>
='
0'
&
&
A<
9'
)
returntrue;
else
returnfalse;
}
//检测是否为字符,是则返回true,否则返回false
boolIsLetter(charch){
if((ch>
A'
ch<
Z'
)||(ch>
a'
z'
))
returnfalse;
//检测是否为分隔符,是则返回true,否则返回false
boolIsSeparator(charch){
if(ch=='
('
||ch=='
)'
||ch=='
{'
}'
;
'
'
.'
||
ch=='
:
\'
\"
['
]'
#'
_'
//检测是否为关键字,是则返回true,否则返回false
boolIsKeyWord(char*a){
inti=0;
for(i;
i<
67;
i++)
if(strcmp(a,keyWord[i].a)==0){
returntrue;
}
//预处理去掉注释、换行、空格等
voidScanner(chars[],chara[]){
inti=0,j=0,k=strlen(s);
for(i;
k;
i++){
if(s[i]=='
/'
s[i+1]=='
){
do{
i++;
}while(s[i]!
='
\n'
);
i--;
elseif(s[i]=='
s[i+1]=='
*'
||s[i-1]!
continue;
\t'
||s[i]=='
?
a[j++]='
'
else
a[j++]=s[i];
}
cout<
<
"
\n系统经过预处理后的输出(去掉注释和换行):
endl;
a<
\n\n"
系统经过预处理后的输出(去掉注释、换行、空格等):
for(i=0;
i<
strlen(a);
i++){
if(a[i]=='
else
cout<
a[i];
endl<
voidHandle(chars[]){//词法分析
charch;
for(intj=0;
j<
strlen(s);
j++){
charword[20]={'
\0'
inti=0;
ch=s[j];
if(ch=='
elseif(IsLetter(ch)){
word[i++]=ch;
ch=s[++j];
}while(IsLetter(ch)||IsDigit(ch)||ch=='
j--;
word[i]='
if(IsKeyWord(word))
cout<
(1,'
word<
)"
else
(2,'
elseif(IsDigit(ch)){
}while(IsDigit(ch));
(3,'
elseif(IsSeparator(ch)){
word[0]=ch;
(5,'
else{
if(word[0]=='
+'
||word[0]=='
-'
>
word[0]=='
|'
if(s[j+1]==word[0]||s[j+1]=='
word[1]=s[++j];
cout<
(4,'
}
else
}
elseif(word[0]=='
!
%'
^'
if(s[j+1]=='
else
elseif(word[0]=='
\\'
n'
||s[j+1]=='
t'
||
s[j+1]=='
||s[j+1]=='
(无法识别字符,'
\n"
intmain(){
inti;
charb=32,ch;
FILE*fp;
do{
i=0;
chars[10000];
chara[10000]={'
fp=fopen("
code.txt"
rb+"
if(fp==NULL){