首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 范文大全
  • 古典文学
  • 职场知识
  • 中国文学
  • 公文书信
  • 外国名著
  • 寓言童话
  • 百家讲坛
  • 散文/诗歌
  • 美文欣赏
  • 礼仪知识
  • 民俗风情
  • 谜语大全
  • 名言警句
  • 编译原理词法分析实验报告

    时间:2020-10-07 12:04:06 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:词法 编译 原理

      一. 实验题目:设计基于 C 语言词法分析器 二. 实验目的:通过设计编制调试 C 语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

     编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

     三. 词法分析器的算法分析:(可用 N-S 图或流程图)

     四. 程序代码 程序开始运行 读取文件中的程序且分析读到的字符 是字母 识别保留字和标识符 是 是数字 识别整数 是 否 否 是否是下划线 否 是 识别其他的符号 识别注释的内容 输出程序的数字和标识符 程序结束!!!

     #include<bits/stdc++.h>

     using namespace std; string keywords[20] = { "include","void","main","int",

      "char","float","double","if",

      "else","then","break","continue",

      "for","do","while","printf","scanf",

      "begin","end","return" }; char rz[99999] = " "; string id[10000]; int pp = 0; string nu[10000]; int qq = 0;

     int isLetter(char a)

     //判断是否是字母 {

     if(a>="a"&&a<="z") return 1;/*添加了判断是否为英文字母的函数*/

     if(a>="A"&&a<="Z") return 1;

     return 0; }

     int isDigit(char a)

     //判断是否是数字 {

     if((a-"0")>=0&&(a-"0")<=9) return 1;/*添加了判断是否为数字的函数*/

     else return 0; }

     int alpha(int st)

     //识别保留字和标识符,给此函数的的语句加上注释。

     {

     char wordbuf[20] = " ";//定义一个字符数组,用来存放需要得判断字符。

     int n = 0;//指针只向第一位。

     for (;;)

     {

      wordbuf[n] = rz[st];//吧要判断的字符赋值给字符数组。

      st++;//指针往下一位指。

      n++;//指针往下一位指。

      if ((isDigit(rz[st]) == 1) || (isLetter(rz[st]) == 1) || (rz[st] == "_"))

      //判断是否符合首字母为字母,数字或下划线。

      wordbuf[n] = rz[st];//符合就赋值,继续匹配。

      else

     break;//不符合就跳出函数。

     }

     int flag = 0;

     for (int k = 0; k < 20; k++)//判断上步所匹配的字符串是否为关键字。是的话则将 flag 置 1,否则继续匹配

     {

      if (strcmp(keywords[k].c_str(),wordbuf) == 0) //判断字符串是否相等。

     flag = 1;//相等将 flag 赋值为 1。

     }

     if (flag == 0)

     {

      int flagg = -1;

      for (int t = 0; t < pp; t++)//判断是否重复出现过,并且标记 flag。

      {

     if (strcmp(id[t].c_str(), wordbuf) == 0)//判断字符串是否相等。

     {

      flagg = t;

      }

      }

      if (flagg != -1)//如果不存在直接输出。

     printf(" (id,%d) ", flagg);

      else

      {

     id[pp] = wordbuf;//若存在输出原编号

     printf(" (id,%d) ", pp);

     pp++;//下表加一。

      }

     }

     Else//输出匹配到的关键字。

     {

      printf(" (");

      for (int i = 0; i < n; i++)

      {

     printf("%c", wordbuf[i]);

      }

      printf(",-) ");

     }

     return st;//返回下标 }

     int number(int st)

     //识别整数 {

     char numbuf[20] = " ";//定义一个数组存数字

     int n = 0;

     int k = 0;

     int flag = 0;

     for (;;)

     {

      numbuf[n] = rz[st];

      st++;

      n++;

      if (isDigit(rz[st]) == 1)//如果是数字存入数组

      {

     numbuf[n] = rz[st];

      }

      else if ((k == 0) && (rz[st] == "."))//否则

      {

     numbuf[n] = rz[st];

     k++;

      }

      else if (isLetter(rz[st]) == 1)

      {

      numbuf[n] = rz[st];

     flag = 1;

     continue;

      }

      else

     break;

     }

     if (flag == 0)

     {

      int flagg = -1;

      for (int t = 0; t < qq; t++)

     if (strcmp(nu[t].c_str(), numbuf) == 0)

      flagg = t;

      if (flagg != -1)

     printf(" (nu,%d) ", flagg);

      else

      {

     nu[qq] = numbuf;

     printf(" (nu,%d) ", qq);

     qq++;

      }

     }

      else {

      printf(" (");

      for (int i = 0; i < n; i++)

     printf("%c", numbuf[i]);

      printf(",error digital!) ");

     }

     return st; } int anotation(int st)

     //处理除号/和注释,给此函数的语句加上注释

     {

     char tabuf[9999] = " ";//定义字符数组,用来存放需要判断的字符。

     int n = 0;

     //指针指向第一位

     st++;//指针指向第一位

      if (rz[st] == "/")

     //形成单行注释

     {

      printf("

     (//,-)");//将其输出

      st++;//指针指向下一位

      while (rz[st] != 10)

     //当遇到换行符时跳出,否则持续赋值注释内容

     {

     tabuf[n] = rz[st]; //赋值

     st++;//指针指向下一位

     n++;//指针指向下一位

      }

      printf(" \n 注释");

      for (int i = 0; i < n; i++)//输出注释的信息

     printf("%c", tabuf[i]);

     }

     else if (rz[st] == "*")

     //形成多行注释

     {

      printf("

     (/*,-)

     ");

      st++;//指针指向下一位

      int stt = st + 1;

      while (1)

      {

     if (rz[st] == "*" && rz[st + 1] == "/")//遇到*/跳出循环

      break;

     tabuf[n] = rz[st];//赋值

     st++;//指针指向下一位

     n++;//指针指向下一位

      if (rz[st + 1] == "\0")//空格就报错!

     {

      printf("(/* error!!\n)");

      return st + 1;//返回

     }

      }

      printf(" \n 注释");

      for (int i = 0; i < n; i++)//输出注释的内容

     printf("%c", tabuf[i]);

      printf("

     (*/,-)

     ");

      st = st + 2;

     }

     else if (rz[st] == "=")

     {

      st++;

      printf("

     (/*,-)

     ");

     }

     else printf("

     (/,-)

      ");

     return st;//返回下标 } int other(int st)

     //函数识别其他特殊字符 {

      switch (rz[st])

     {

     case"=":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf(" (rlop,==)

     ");

      }

      else

     printf(" (rlop,=)

     ");

      break;

     case"+":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf("

     (+=,-)

     ");

      }

      else if (rz[st] == "+")

      {

     st++;

      printf("

     (++,-)

     ");

      }

      else printf("

     (+,-)

     ");

      break;

     case"-":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf("

     (-=,-)

     ");

      }

      else if (rz[st] == "-")

      {

     st++;

     printf("

     (--,-)

     ");

      }

      else

     printf("

     (-,-)

     ");

      break;

     case"*":

      st++;

      if (rz[st] == "=")

     {

     st++;

     printf("

     (*=,-)

     ");

      }

     else

     printf("

     (*,-) ");

      break;

     case">":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf(" (rlop,>=)

     ");

      }

      else printf(" (rlop,>)

     ");

      break;

     case"<":

      st++;

      if (rz[st] == "=")

      {

     st++;

      printf(" (rlop,<=)

     ");

      }

      else

     printf(" (rlop,<)

     ");

      break;

     case"%":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf("

     (\%=,-) ");

      }

      else

     printf("

     (\%,-)

     ");

      break;

     case"!":

      st++;

      if (rz[st] == "=")

      {

     st++;

     printf("

     (!=,-)

     ");

      }

     else

     printf("

     (!,wrong thing!)

     ");

      break;

     case"&":

      st++;

      if (rz[st] == "&")

      {

     st++;

     printf(" (&&,-)

     ");

      }

      else printf(" (&,worng word!)

     ");

      break;

     case"|":

      st++;

      if (rz[st] == "|")

      {

     st++;

     printf("

     (||,-)

     ");

      }

      else

     printf("

     ( |,worng word ! )

     ");

      break;

      case"{":

      st++;

      printf("

     ({,-)

     ");

      break;

     case"}":

      st++;

      printf("

     (},-)

     ");

      break;

     case"(":

      st++;

      printf("

     ((,-)

     ");

      break;

     case")":

      st++;

      printf("

     (),-)

     ");

      break;

     case"[":

      st++;

      printf("

     ([,-)

     ");

      break;

     case"]":

      st++;

     printf("

     (],-)

     ");

      break;

     case":":

      st++;

      printf("

     (:,-)

     ");

      break;

     case"#":st++;

      printf("

     (#,-)

     ");

      break;

     case";":

      st++;

      printf("

     (;,-)

     ");

      break;

     case".":

      st++;

      printf("

     (.,-)

     ");

      break;

     case",":

      st++;

      printf("

     (,,-)

     ");

      break;

     case" ":

     st++;

      break;

     case "

     ":

      st++;

      break;

     case 10:

      st++;

      printf("\n");

      break;

     case34:

      st++;

      printf(" (\",-)

     ");

      break;

     case39:

      st++;

      printf("

     (",-)

     ");

      break;

     default:

      printf("

     (%c,worngthing) ", rz[st]);

      st++;

     }

     return st;

     } int choice(int st)

     //根据读入的单词的第一个字符确定调用不同的单词识别函数 {

      if (isLetter(rz[st]) == 1)

      st = alpha(st);

      else if (isDigit(rz[st]) == 1)

      st=number(st); /*调用函数*/

      else if (rz[st] == "/")

      st=anotation(st);/*调用函数*/

     else

      st=other(st);/*调用函数*/

     return st;

     } int main() {

     int i = 0;

     FILE* fp;

     char name[10];

     printf("请输入文件名:\n");

     scanf("%s", &name);

     if ((fp = fopen(name, "r")) == NULL)

      {

      printf("Open error!");

      exit(0);

     }

     char ch = fgetc(fp);

     while (ch != EOF)

     {

      rz[i] = ch;

      i++;

      ch = fgetc(fp);

     }

     fclose(fp);

     int j = 0;

     while (rz[j] != "\0")

      j = choice(j);

     cout << endl << "

     程序中标示符如下 " << endl;

     for (i = 0; i < pp; i++)

      cout << i << "

      " << id[i] << endl;

     cout << " 程序中数字如下" << endl;

     for (j = 0; j < qq; j++)

      cout << j << "

      " << nu[j] << endl;

     system("pause");

     } 五. 运行结果及分析

      六. 实验心得

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识