⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifafenxi.cpp

📁 词法分析程序:一. 为PL/0语言建立一个词法分程序GETSYM(函数) 把关键字、算符、界符称为语言固有的单词
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cType.h>
#include<conio.h>

/*全局变量声明*/
char *prog,token[8];
char ch;/*当前读入的字符*/
int syn,sum;/*syn-单词种别码,token-单词,sum-整型常量*/
int p,m,n;/*p是缓冲区prog的指针,m是token的指针*/

char *rwtab[6]={"begin","if","then","while","do","end"};/*关键字*/
char *sytab[4]={":=","<>","<=",">="};/*双符号*/

int cType(char c)
{
if(isalpha(c))          return 1; /*字母*/
else if(c>='0'&&c<='9') return 2; /*数字*/
else if(c==32)          return 32;/*空格*/
else                    return 3; /*符号*/
return 0;
}

/*清空token*/
void tokenCls()
{
int i;
for(i=0;i<8;i++)
   token[i]=0;
m=0;
}

/*得到单词或符号的种别码*/
int getSyn(char *s,int type)
{
int i;
if(type==0)/*type=0表示计算单词*/
{
   for(i=0;i<6;i++)
    if(!strcmp(s,rwtab[i])) return(i+1);
   return 10;
}
else if(type==1)/*type=1表示计算单符号*/
   switch(s[0])
   {
   case'+':return 13;
   case'-':return 14;
   case'*':return 15;
   case'/':return 16;
   case':':return 17;
   case'<':return 21;
   case'>':return 23;
   case'=':return 25;
   case';':return 26;
   case'(':return 27;
   case')':return 28;
   case'#':return 0;
   default:return -1;/*代表输出为错误信息*/
   }
else/*type=2表示计算双符号*/
{
   if(!strcmp(s,sytab[0])) return 18; /*是":="*/
   if(!strcmp(s,sytab[1])) return 21; /*是"<>"*/
   if(!strcmp(s,sytab[2])) return 22; /*是"<="*/
   if(!strcmp(s,sytab[3])) return 24; /*是">="*/
   return -1;                          /*代表输出为错误信息*/
}
}

int wType()/*判断字符段类型*/
{
int i,t1=0,t2=0,t3=0;
for(i=0;i<m;i++)
   if(cType(token[i])==1) t1++;
   else if(cType(token[i])==2) t2++;
t3=m-t1-t2;
if(t2==m)
{
   sum=strtol(token,NULL,10);/*将数字转换为整型*/
   return 2;       /*全数字字符段*/
}
if(t3==m) 
   if(m==1) return 3;/*单符号字符段*/
   else return 4;    /*多符号字符段*/
return 5;             /*一般单词*/
}

void outPut(int type)/*单项输出结果*/
{
switch(type)
{
case 1:printf("\t    (%d,\"%s\")\n",getSyn(token,0),token);break; /*输出单词*/
case 2:printf("\t    (11,%d)\n",sum);                      break; /*输出数据*/
case 3:printf("\t    (%d,%s)\n",getSyn(token,1),token);    break; /*输出单符号*/
case 4:printf("\t    (%d,%s)\n",getSyn(token,2),token);    break; /*输出多符号*/
}
}

void scaner()/*扫描字符串*/
{
int bp;
while(32==*(prog+p))
   p++;/*忽略开始的空格*/
bp=p;
do
{
   ch=*(prog+p);
   if(cType(ch)==1||cType(ch)==2)/*读入的是字母或是数字*/
   {
    if(cType(*(prog+p-1))==3&&p!=bp)
    {
     outPut(wType());/*输出符号*/
     tokenCls();
    }
    token[m++]=ch;
   }
   else if(cType(ch)==3)/*读入的是符号*/
   {
    if(cType(*(prog+p-1))==1||cType(*(prog+p-1))==2)/*前一个读入的是字母,则输出单词*/
    {
     if(wType()==2)
      outPut(2);
     else if(wType()==5)
      outPut(1);
     tokenCls();
    }
    token[m++]=ch;
   }
   else if(ch==32)/*读入的是空格*/
   {
    switch(wType())
    {
    case 2:outPut(2);break; /*输出数字*/
    case 3:outPut(3);break; /*输出单符号*/
    case 4:outPut(4);break; /*输出多符号*/
    case 5:outPut(1);break; /*输出单词*/
    }
    tokenCls();
   }
   p++;
}while(*(prog+p-1)!='#');
token[0]='#';
outPut(3);
}

void main()
{
m=n=0;
prog="begin x2:=9;if x<>0 then!<x:=2*x+1/3;end#";/*输入表达式*/
printf("Expression:\"%s\"\nResult:\n",prog);
scaner();
getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -