?? 新建 文本文檔 (5).txt
字號:
一、實驗目的與基本要求
實驗目標與要求:
1. 通過實驗要學會用BNF范式定義一個簡單的程序設計語言。
2. 學會用高級程序設計語言設計一詞法分析器、語法分析器、中間代碼產生器和解釋執行代碼的解釋器。
3. 用這個簡單的程序設計語言書寫一段程序,并調試運行出來。
二、詞法分析器功能:
該詞法分析器能夠識別兩個數的相加運算的程序。輸入源程序后,能輸出單詞符號。單詞符號是一個程序語言的基本語法符號。在詞法分析器所輸出的單詞符號表示為如下的二元式: <單詞種別,單詞符號的屬性值>
在單詞類別中分為:
1.指向某一標識符的符號表項指針 2.常數 3.界符 4.運算符
5.關鍵字 6.未知單詞
其中2~5的單詞符號的屬性值全部可以看做是同一種形式“--”。
三、原理
從左至右逐個字符地對源程序進行掃描,產生一個個單詞符號,把作為字符的源程序改造成為單詞符號串的中間程序。
四、 函數說明:
1. ch:字符變量,存放最新讀進的源程序字符。
2. StrToken:字符數組,用于存放構成單詞符號的字符串。
3. GetBC( ):檢查ch中的字符是否為空白。若是,則調用ch=fgetc(flp)直到ch中進入一個非空白字符。
4. Concat( ):將ch中的字符連接到strToken之后。
5. IsLetter( )和IsDigit( ):分別判斷ch中的字符是否為字母和數字。若是則返回1,否則返回0。
6. Reserve( ):對strToken中的字符串查找保留字表str,若它是一個保留字則返回1,否則返回0。
7. Retract( ):將搜索指示器指針fp回調一個字符位置,并且將ch置為空白字符。
8. text.txt文件用來存儲需要被詞法分析器編譯的源程序。table.txt文件用來存儲編譯后的結果,即二元式表。
五、 編譯源程序及編譯后的結果
被編譯的源程序zhongyuan.txt如下:
原程序:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(x>y)
printf("%s",str);
else
scanf("%d",a);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
輸出結果:
if--> -
9--> -
標志符-->x -
6--> -
標志符-->y -
10--> -
printf--> -
9--> -
11--> -
7--> -
標志符-->s -
11--> -
8--> -
標志符-->str -
10--> -
12--> -
else--> -
scanf--> -
9--> -
11--> -
7--> -
標志符-->d -
11--> -
8--> -
標志符-->a -
10--> -
12--> -
********************************
單詞符號 屬性值
if -
printf -
else -
scanf -
標志符 地址
> 6
% 7
( 8
) 9
" 10
; 11
*********************************
六、 詞法分析器的源代碼如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int k,u;
char ch,StrToken[40]={" "},sign[40];
int q=0,p=20,a[40];
int aaa();
FILE *fp;
char *name[20]={"main","int","max","scanf","printf","if","else","return"," "};
void Getchar()
{if(ch != EOF)
ch=fgetc(fp);
else
return;
}
void GetBC()
{
while(ch==' ')
{Getchar();
}
return;
}
void concat(char ch,char StrToken[],int u)
{StrToken[u]=ch;
u++;
}
int ISLetter (char ch)
{if(ch<='Z'&& ch>='A'||ch<='z'&& ch>='a')
return 1;
else
return 0;
}
int IsDigit(char ch)
{if(ch<='9'&& ch>='0')
return 1;
else
return 0;
}
int reserre(char StrToken[],char *name[])
{
int i=0;
while(!strcmp(name[i]," ")==0)
{
if(strcmp(name[i],StrToken)==0)
return i;
i++;
}
return 0;
}
void retract(char ch)
{fputc(ch,fp);
ch=' ';
}
int InsertId(char StrToken[],char sign[])
{
strcpy(sign,StrToken);
sign++;
q++;
return q;
}
int InsertConst(char StrToken[],int p)
{
int j3=0;
a[j3]=(int)StrToken;
p++;
j3++;
return p;
}
void print1(int code)
{printf("%d\t-->\t-\n",code);
}
void print2(int code,int value)
{printf("%d\t-->\t%d\n",code,value);
}
main()
{int aaa();
fp=fopen("xw1.txt","r+");
k=aaa();
if(k==0)
printf("error!\n");
else
printf("task is over\n");
fclose(fp);
}
int aaa()
{int code,value;
while(ch!=EOF)
{ Getchar();
GetBC();
u=0;
if(ISLetter(ch))
{
while(ISLetter(ch)||IsDigit(ch))
{ concat(ch,StrToken,u);
Getchar();
GetBC();
}
retract(ch);
StrToken[u]='\0';
code=reserre(StrToken,name);
if(code==0)
{value=InsertId(StrToken,sign);
printf("關鍵字\t-->\t%s--> -\n",StrToken);
}
else
printf("標志符\t-->\t%s--> -\n",StrToken);
}
else if(IsDigit(ch))
{
while (IsDigit(ch))
{concat(ch,StrToken,u);
Getchar();
GetBC();
}
retract(ch);
code=10;
value=InsertConst(StrToken,p);
print2(code,value);
}
else if(ch=='>')
{
code=6;
print1(code);
}
else if(ch=='%')
{code=7;
print1(code);
}
else if(ch==',')
{code=8;
print1(code);
}
else if(ch=='(')
{code=9;
print2(code,value);
}
else if(ch==')')
{code=10;
print1(code);
}
else if(ch=='"')
{code=11;
print1(code);
}
else if(ch==';')
{code=12;
print1(code);
}
else if(ch==EOF)
return 1;
}
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -