编译原理实验二【编译原理实验一】
华中师范大学
CHINA 题 目: 院 班 级:姓 名:学 号:指导老师:NORMAL UNIVERSITY
0701
CENTRAL
一.实验题目
词法分析 二.实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 三.实验内容
输入: 对所给文法的源程序字符串。
输出: 二元组(syn, token或 sum)构成的序列。 其中: syn 为单词自身字符串; token为存放的单词自身字符串; sum为整形常数。 四.实验步骤
1.进行算法分析
2.编写程序
3.测试程序
4.进行调试
5.写实验报告
五.实验设计思想
六.实现代码
#include #include #include
void scaner();
char prog[80] , token[8];
int syn, p, m, n, sum, i, len;
char *rwtab[6]={"begin", "if", "then","while","do", "end"};
int main() {
FILE *f1;
f1=fopen("read.txt","rt"); do {
fgets(prog, 80,f1); len=strlen(prog); prog[len-1]=0; p=0; do {
scaner(); if(syn==-1) {
if(prog[p]==0) peak;
else if(prog[p++]==9) continue; }
switch(syn) {
case 11: printf("(%d, %d)\n",syn,sum);peak; case -1: printf("error\n"); p++;peak; default: printf("(%d, %s)\n",syn,token); }
}while(syn && prog[p]); if(syn==0) peak;
}while(!feof(f1)); fclose(f1); return 0; }
void scaner() {
m=0; sum=0;
memset(token,0, sizeof(token)); while(prog[p]==" ") p++;
if(prog[p]>="a" && prog[p]="A" && prog[p]
{
while(prog[p]>="a" && prog[p]="A" && prog[p]="0" && prog[p]
for(n=0; n
if(strcmp(token,rwtab[n])==0) {
syn=n+1; peak; } }
else if(prog[p]>="0" && prog[p]
while(prog[p]>="0" && prog[p]
sum=sum*10 + prog[p] - "0"; p++; }
syn=11; }
else
switch(prog[p]) {
case "") {
syn=21;
token[m++]=prog[p++]; }
else if(prog[p]=="=") {
syn=22;
token[m++]=prog[p++]; }
else
syn=20; token[m]="\0"; peak;
case ">": token[m++]=prog[p++]; if(prog[p]=="=") {
{
while(prog[p]>="a" && prog[p]="A" && prog[p]="0" && prog[p]
token[m++]=prog[p++];
token[m]="\0";
syn=10;
for(n=0; n
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
peak;
}
}
else if(prog[p]>="0" && prog[p]
{
while(prog[p]>="0" && prog[p]
{
sum=sum*10 + prog[p] - "0";
p++;
}
syn=11;
}
else
switch(prog[p])
{
case "
if(prog[p]==">")
{
syn=21;
token[m++]=prog[p++];
}
else if(prog[p]=="=")
{
syn=22;
token[m++]=prog[p++];
}
else
syn=20;
token[m]="\0";
peak;
case ">": token[m++]=prog[p++];
if(prog[p]=="=")
{
} } syn=24; token[m++]=prog[p++]; } else syn=23; token[m]="\0"; peak; case ":": token[m++]=prog[p++]; if(prog[p]=="=") { syn=18; token[m++]=prog[p++]; } else syn=17; token[m]="\0"; peak; case "+": syn=13; token[0]=prog[p++]; peak; case "-": syn=14; token[0]=prog[p++]; peak; case "*": syn=15; token[0]=prog[p++]; peak; case "/": syn=16; token[0]=prog[p++]; peak; case "=": syn=25; token[0]=prog[p++]; peak; case ";": syn=26; token[0]=prog[p++]; peak; case "(": syn=27; token[0]=prog[p++]; peak; case ")": syn=28; token[0]=prog[p++]; peak; case "#": syn=0; token[0]=prog[p++]; peak; default: syn=-1;
读入begin
x:=9;
if x>0
then
x:= 2*x + 1/3;
? end #:
输出结果:
七.小结
这个程序其实就简和单的单词统计的问理论知识里面的大不相同,通过对这个程序的写我了解了相关的知识
八.参考文献
编译原理教