分享

PL/0 词法分析器设计 c语言

 quasiceo 2017-03-21
标签: C++编译原理
2016-04-20 15:46 1042人阅读 评论(0) 收藏 举报
分类:

版权声明:本文为博主许佳佳原创文章,转载请务必注明出处。

【实验内容】

用C余元编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序风格成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常熟以及界符)输出。


运行效果:

    


基本思路:

1、读取所有的输入的文本,存入一个二维数组。(数组的宽度固定)

2、对二维数组一行行进行处理

3、对文本进行操作的时候,创建两个临时字符数组,一个存储变量名,一个存储常量。

对某行进行遍历的时候,倘若碰到字母,就读完该单词并存储到临时数组里,进行基本字判断后输出。

光标往后移动该单词的长度后,继续循环。(比如读到的是end,那么我该行的光标就要+3,然后继续循环)

倘若读到数字也是一样,只是不需要判断基本字,所以更为简单。



代码:

  1. #include"stdio.h"  
  2. #include"string.h"  
  3.   
  4. #define lineLength 100  //固定每行的长度  
  5. #define primLength 10   //读取的字符串的长度(标识符之类)  
  6. #define numLength 20    //读取的常量的长度  
  7.   
  8. //存储基本字  
  9. char mPrimary[14][20]= {"begin","call","const","do","end","if","odd",  
  10.                         "procedure","read","then","var","while","write","xujiajia"  
  11.                        };  
  12.   
  13. char text[lineLength][lineLength];//存储读到的内容  
  14. int listLength;//保存读取到的内容的长度  
  15.   
  16. void read()  
  17. {  
  18.     //把所有的数据读入一个二维字符数组中  
  19.     for(int i=0,isEnd=0;; i++)  
  20.     {  
  21.         char my[lineLength];  
  22.         gets(my);  
  23.         for(int j=0; j<lineLength; j++)  
  24.         {  
  25.             text[i][j]=my[j];  
  26.             //判断数组一行是否结束  
  27.             if(my[j]=='\0')  
  28.                 break;  
  29.             else if(my[j]=='.')  
  30.             {  
  31.                 isEnd=1;  
  32.                 break;  
  33.             }  
  34.         }  
  35.         if(isEnd)  
  36.         {  
  37.             listLength=i;  
  38.             break;  
  39.         }  
  40.     }  
  41.   
  42.     //对二维字符数组进行处理  
  43.     for(int i=0,isEnd=0; i<=listLength; i++)  
  44.     {  
  45.         char prim[primLength];//新建一个字符数组用来存储基本字或者变量名  
  46.         char num[numLength];//新建一个字符数组用来存储常量  
  47.         for(int k=0; k<primLength; k++) //清空数组  
  48.             prim[k]='\0';  
  49.         for(int k=0; k<numLength; k++) //清空数组  
  50.             num[k]='\0';  
  51.   
  52.         for(int j=0; text[i][j]!='\0'; j++)  
  53.         {  
  54.             if(text[i][j]=='.')  
  55.             {  
  56.                 printf(". 界符\n");  
  57.                 isEnd=1;  
  58.                 break;  
  59.             }  
  60.             else if(text[i][j]==' ')  
  61.             {  
  62.                 continue;  
  63.             }  
  64.             else if(text[i][j]>='a'&&text[i][j]<='z')  
  65.             {  
  66.                 for(int k=0; (text[i][j]>='a'&&text[i][j]<='z')||(text[i][j]>='0'&&text[i][j]<='9'); j++,k++) //读入字符串  
  67.                     prim[k]=text[i][j];  
  68.                 j--;//由于用j去判断循环的结束,此处需要回退一个字符  
  69.   
  70.                 for(int k=0; prim[k]!='\0'; k++) //输出字符串  
  71.                     printf("%c",prim[k]);  
  72.   
  73.                 int ii=0,jj=13;//二分查找,查找是否为基本字  
  74.                 int kk;  
  75.                 while(ii<=jj)  
  76.                 {  
  77.                     kk=(ii+jj)/2;  
  78.                     if(strcmp(prim,mPrimary[kk])<=0)  
  79.                         jj=kk-1;  
  80.                     if(strcmp(prim,mPrimary[kk])>=0)  
  81.                         ii=kk+1;  
  82.                 }  
  83.                 if(ii-1>jj)//搜索成功,确定为基本字  
  84.                     printf(" 基本字\n");  
  85.                 else  
  86.                     printf(" 标识符\n");  
  87.   
  88.                 for(int k=0; prim[k]!='\0'; k++) //清空数组方便下次读入  
  89.                     prim[k]='\0';  
  90.             }  
  91.             else if(text[i][j]>='0'&&text[i][j]<='9')  
  92.             {  
  93.                 for(int k=0; text[i][j]>='0'&&text[i][j]<='9'; j++,k++)//读入数字  
  94.                     num[k]=text[i][j];  
  95.                 j--;//由于用j去判断循环的结束,此处需要回退一个字符  
  96.   
  97.                 for(int k=0; num[k]!='\0'; k++) //输出数字,并且清空方便下次读入  
  98.                 {  
  99.                     printf("%c",num[k]);  
  100.                     num[k]='\0';  
  101.                 }  
  102.                 printf(" 常量\n");  
  103.             }  
  104.             else//此处处理“+-*/,#()等”  
  105.             {  
  106.                 switch(text[i][j])  
  107.                 {  
  108.                 case '<':  
  109.                 case '>':  
  110.                 case ':':  
  111.                 {  
  112.                     if(text[i][j+1]=='=')  
  113.                     {  
  114.                         printf("%c%c 运算符\n",text[i][j],text[i][j+1]);  
  115.                         j++;  
  116.                     }  
  117.                     else  
  118.                     {  
  119.                         printf("%c 运算符\n",text[i][j]);  
  120.                     }  
  121.                     break;  
  122.                 }  
  123.                 case '+':  
  124.                 case '-':  
  125.                 case '*':  
  126.                 case '/':  
  127.                 {  
  128.                     printf("%c 运算符\n",text[i][j]);  
  129.                     break;  
  130.                 }  
  131.                 case '(':  
  132.                 case ')':  
  133.                 case ',':  
  134.                 case ';':  
  135.                 {  
  136.                     printf("%c 界符\n",text[i][j]);  
  137.                     break;  
  138.                 }  
  139.                 default:  
  140.                     printf("%c 标识符\n",text[i][j]);  
  141.                 }  
  142.   
  143.             }  
  144.         }  
  145.         if(isEnd)  
  146.             break;  
  147.     }  
  148. }  
  149.   
  150. int main()  
  151. {  
  152.     read();  
  153.     return 0;  
  154. }  


 

2
0
猜你在找
查看评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多