试验1:词法分析

Posted LeonQiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试验1:词法分析相关的知识,希望对你有一定的参考价值。

实验一、词法分析实验

商业软件工程3  李华秋  201506110205

一、 实验目的

    编制一个词法分析程序。通过设计一个编译词法分析程序,实现对词法分析转换的理解,加深对转换过程的认识,通过这个软件把理论知识运用到实际之中。

 

二、 实验内容和要求

     输入:源程序字符串

     输出:二元组(种别,单词本身)

 

三、 实验方法、步骤及结果测试

 

  1. 源程序名:

 

  1. 原理分析及流程图

#include <stdio.h>

#include <string.h>char prog[80],token[8],ch;int syn,p,m,n,sum;char *key[6]={"begin","if","then","while","do","end"};//关键字scaner();

main()

{p=0;

printf("\\n请输入字符窜,以‘#’字结束):\\n");do{

scanf("%c",&ch);

prog[p++]=ch;

}while(ch!=\'#\');

p=0;do{

scaner();switch(syn)

{case 11:printf("( %-10d%5d )\\n",sum,syn);break;case -1:printf("你输入的数据有错!\\n");

getch();

exit(0);default: printf("( %-10s%5d )\\n",token,syn);break;

}

}while(syn!=0);

getch();

}

scaner()

{  sum=0;for(m=0;m<8;m++)token[m++]=NULL;

ch=prog[p++];

m=0;while((ch==\' \')||(ch==\'\\n\'))ch=prog[p++];if(((ch<=\'z\')&&(ch>=\'a\'))||((ch<=\'Z\')&&(ch>=\'A\')))

{ while(((ch<=\'z\')&&(ch>=\'a\'))||((ch<=\'Z\')&&(ch>=\'A\'))||((ch>=\'0\')&&(ch<=\'9\')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;for(n=0;n<6;n++)if(strcmp(token,key[n])==0)

{ syn=n+1;break;

}

}else if((ch>=\'0\')&&(ch<=\'9\'))

{ while((ch>=\'0\')&&(ch<=\'9\'))

{ sum=sum*10+ch-\'0\';

ch=prog[p++];

}

p--;

syn=11;

}else switch(ch)

{ case \'<\':token[m++]=ch;

ch=prog[p++];if(ch==\'=\')

{  syn=22;

token[m++]=ch;

}else

{  syn=20;

p--;

            }break;case \'>\':token[m++]=ch;

ch=prog[p++];if(ch==\'=\')

{ syn=24;

token[m++]=ch;

}else

{ syn=23;

p--;

}break;case \'+\': token[m++]=ch;

ch=prog[p++];if(ch==\'+\')

{ syn=17;

token[m++]=ch;

}else

{ syn=13;

p--;

}break;case \'-\':token[m++]=ch;

ch=prog[p++];if(ch==\'-\')

{ syn=29;

token[m++]=ch;

}else

{ syn=14;

p--;

}break;case \'!\':ch=prog[p++];if(ch==\'=\')

{ syn=21;

token[m++]=ch;

}else

{ syn=31;

 

p--;

}break;case \'=\':token[m++]=ch;

ch=prog[p++];if(ch==\'=\')

{ syn=25;

token[m++]=ch;

}else

{ syn=18;

 p--;

}break;case \'*\': syn=15;

token[m++]=ch;break;case \'/\': syn=16;

token[m++]=ch;break;case \'(\': syn=27;

token[m++]=ch;break;case \')\': syn=28;

token[m++]=ch;break;case \'{\': syn=5;

token[m++]=ch;break;case \'}\': syn=6;

token[m++]=ch;break;case \';\': syn=26;

token[m++]=ch;break;case \'\\"\': syn=30;

token[m++]=ch;break;case \'#\': syn=0;

token[m++]=ch;break;case \':\':syn=17;

token[m++]=ch;break;default: syn=-1;break;

}

token[m++]=\'\\0\';

}

 

  1. 主要程序段及其解释:

for(m=0;m<8;m++)token[m++]=NULL;

ch=prog[p++];

m=0;

while((ch==\' \')||(ch==\'\\n\'))ch=prog[p++];

if(((ch<=\'z\')&&(ch>=\'a\'))||((ch<=\'Z\')&&(ch>=\'A\')))

{ while(((ch<=\'z\')&&(ch>=\'a\'))||((ch<=\'Z\')&&(ch>=\'A\'))||((ch>=\'0\')&&(ch<=\'9\')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

  1. 运行结果及分析

四、 实验总结

 

对词法转换过程认识不够,没能独立完成本次试验,对课本的知识还一知半解,刚接触逻辑上有些跟不上,课堂上的东西也没全掌握,很多问题都是靠查阅资料和问同学才解决。

 

 

 

以上是关于试验1:词法分析的主要内容,如果未能解决你的问题,请参考以下文章

词法分析试验报告

LLVM 极简教程: 第一章 教程简介与词法分析器

词法分析

词法分析器

编译技术图式(第三章 词法分析)

实验1 词法分析