• 201506110112--李立建--实验一报告


    实验一、词法分析实验

    专业:商业软件工程   姓名:李立建  学号:201506110112

    一、        实验目的

    (1)    理解词法分析在编译程序中的作用。

    (2)    加深对有穷自动机模型的理解。

    (3)    掌握词法分析程序的实现方法。

    (4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

    二、        实验内容和要求

    1,待分析的简单语言的词法

    2,各种单词符号对应的种别码。

    3,词法分析程序的功能(输入,输出)。

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

    1.      源程序名:压缩包文件(rarzip)中源程序名:CIFENXI.c

    可执行程序名:CIFAFEN.exe

    2.      原理分析及流程图

    主要总体设计问题。

    (包括存储结构,主要算法,关键函数的实现等)

    词法分析主程序示意图

     

    主要算法:

    1.先应用数组存放关键字。

    2.利用if,switch进行分析单词符号。

    3.最后输出单词对应的种别码。

    关键函数的实现:

    1.*定义I/O库所用的某些宏和变量*/
    2. /*定义字符串库函数*/
    3./*提供有关屏幕窗口操作函数*/
    4./*分类函数*/

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

    实现主要功能的程序段,重要的是程序的注释解释。

    主要程序共分为三大块,分别是标示符、数字、符号。

    void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
    token[n]='';
    ch=prog[p++];
    while(ch==' ')
    ch=prog[p++];
    if(isalpha(ch)) /*ch为字母字符*/
    {
    while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/
    {
    token[m++]=ch;
    ch=prog[p++];}
    token[m++]='';
    ch=prog[p--];
    syn=10;
    for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0) /*字符串的比较*/
    {
    syn=n+1;
    break;}}
    else
    if(isdigit(ch)) /*ch是数字字符*/
    {
    while(isdigit(ch)) /*ch是数字字符*/
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];}
    ch=prog[p--];
    syn=11;}
    else
    switch(ch)//识别符号的函数
    {
    case'<':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='>'){
    syn=21;
    token[m++]=ch;}
    else if(ch=='='){
    syn=22;
    token[m++]=ch;}
    else{
    syn=20;
    ch=prog[p--];}
    break;
    case'>':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=24;
    token[m++]=ch;}
    else{
    syn=23;
    ch=prog[p--];}
    break;
    case':':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=18;
    token[m++]=ch;}
    else{
    syn=17;
    ch=prog[p--];}
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;}}

    1. 4.      运行结果及分析

    一般必须配运行结果截图,结果是否符合预期及其分析。

      

    源代码:

    void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
    token[n]='';
    ch=prog[p++];
    while(ch==' ')
    ch=prog[p++];
    if(isalpha(ch)) /*ch为字母字符*/
    {
    while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/
    {
    token[m++]=ch;
    ch=prog[p++];}
    token[m++]='';
    ch=prog[p--];
    syn=10;
    for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0) /*字符串的比较*/
    {
    syn=n+1;
    break;}}
    else
    if(isdigit(ch)) /*ch是数字字符*/
    {
    while(isdigit(ch)) /*ch是数字字符*/
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];}
    ch=prog[p--];
    syn=11;}
    else
    switch(ch)//识别符号的函数
    {
    case'<':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='>'){
    syn=21;
    token[m++]=ch;}
    else if(ch=='='){
    syn=22;
    token[m++]=ch;}
    else{
    syn=20;
    ch=prog[p--];}
    break;
    case'>':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=24;
    token[m++]=ch;}
    else{
    syn=23;
    ch=prog[p--];}
    break;
    case':':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=18;
    token[m++]=ch;}
    else{
    syn=17;
    ch=prog[p--];}
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;}}
    
     

     

     

     

     

     

    四、实验总结

    本次实验花了将近四小时才完成。在草稿纸上设计的时间大概一个半小时,剩下时间都在实行代码的完善和报告的所要求的步奏。在本次实验中我认识到程序不经常编译,水平只会降低。好多关于之前的知识也会逐渐忘掉。所以以后我会经常写程序,理解程序的内涵。另外,通过本次实验,我又 进一步对词法分析原理的理解。总的来说,收获匪浅!

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    docker for zabbix
    由阿里云宕机引发的思考
    linux清空文件
    RDS导入注意事项
    coreos 常见问题
    2018年7月28日笔记
    2018年7月26日笔记
    2018年7月24日笔记
    作业五之系统设计时所实现的质量属性战术
    作业四之阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章
  • 原文地址:https://www.cnblogs.com/god1924668503/p/5961135.html
Copyright © 2020-2023  润新知