zoukankan      html  css  js  c++  java
  • 201506110135陈若倩词法分析实验报告

    实验一、词法分析实验

    商业软件工程专业   陈若倩  201506110135

    一、 实验目的

    通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

    二、 实验内容和要求

    在原程序中输入源代码

    • 对字符串表示的源程序  
    • 从左到右进行扫描和分解
    • 根据词法规则
    • 识别出一个一个具有独立意义的单词符号
    • 以供语法分析之用
    • 发现词法错误,则返回出错信息

    在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

    1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
    2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
    3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
    4. 分隔符:,、;、{、}、(、)
    5. 常数,如123,4587

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

     

    输出形式:

    • 二元式

    – (单词种别,单词自身的值)

    • 单词种别,表明单词的种类,语法分析需要的重要信息

    – 整数码

    • 关键字、运算符、界符:一符一码
    • 标识符:10, 常数:11
    • 单词自身的值

    – 标识符token、常数sum

    – 关键字、运算符、界符token

     

     

     

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

    1. 源程序名:编译原理 实验报告 中源程序名 算法分析.c

    可执行程序名:编译原理 实验报告.exe

    1. 原理分析及流程图

           

    1. 主要程序段及其解释:
      实现主要功能的程序段,重要的是程序的注释解释。
      
      #include <stdio.h> 
      #include <string.h> 
      #include <conio.h> 
      #include <ctype.h> 
      void cffx(); 
      char prog[80]={'\0'},
      token[8]; 
      char ch;
      int syn,n,sum,m,p; 
      char *rwtab[6]={"begin","if","then","while","do","end"};
      main()
      {
      p=0;
      printf("\nplease input string:\n");
      do {
      ch=getchar();
      prog[p++]=ch;
      }while(ch!='#');
      
      p=0;
      do{
      cffx();
      switch(syn){
      case 11: printf("(%d,%d)\n",syn,sum);break;
      case -1: printf("\n ERROR;\n");break;
      default: printf("(%d,%s)\n",syn,token);
      }
      }while(syn!=0);
      getch();
      }
      void cffx()
      {
      m=0;
      sum=0;
      for(n=0;n<8;n++)
      token[n]='\0';
      ch=prog[p++];
      while(ch==' ')
      ch=prog[p++];
      if(isalpha(ch)) 
      {
      while(isalpha(ch)||isdigit(ch)) 
      {
      token[m++]=ch;
      ch=prog[p++];}
      token[m++]='\0';
      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)) 
      {
      while(isdigit(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;
      }
      }
      
       
      
      运行结果及分析

     

    一、 实验总结

     

    学会编写一个简单的词法分析程序,虽然在过程中有许多艰难。但是最终制作成功的喜悦,就好像在上课终于学会怎么推导出结果一样激动不已。

  • 相关阅读:
    [ProjectEuler.net] 14
    Design patterns
    初等函数定义
    Design patterns 1.6 Design for change
    Programming In Haskell chapter3
    桌面恶心的无法删除的图标之 淘宝购物 删除办法
    程序员学英语三部曲
    e的给定精度求法
    Summary about Architect Visit
    再谈“我是怎么招聘程序员的”(上)
  • 原文地址:https://www.cnblogs.com/severusandsusa/p/5960802.html
Copyright © 2011-2022 走看看