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

📄 新建 文本文档 (4).txt

📁 是关于词法分析的部分代码。是本人这学期的编译原理的设计作业。仅供参考。
💻 TXT
字号:
#include <string.h>
#include<stdio.h>
#include<conio.h>
#define O 350 
#define P 15
#define Q 200

Struct translate
{
int code;
char word[20];
};
Int m,math;
char ch.str[0];
char strToken[p];
struct translate words[Q];

void TakeChar()
{
ch =str[m++];
}

void TakeBC()  // 去掉空白
{
 while(ch==’’)
     TakeChar()

 }
void Concat()
{ 
int len=strlen(strToken);
strToken[len]=ch;
strToken[len+1]=’\0’;
}

int IsDigit() //判断是否是常数
{  
If(ch>=’\0’&&<=’9’)
 return(1);
else
return(0);
}

int IsLetter() //判断是否为标志符
{
if ( (ch>=’a’&&ch<=’m’)|| (ch>=’A’&&ch<=’Z’))
return(1);
else
return(0);
}

int Recover() //判断字符是否为保留字
{
Char *keywords[]={“if”,”int”, “for” ,“while”, “do” ,“return”, “break”, “continue”}};

Int i,math=8;
for(i=0;i<math;i++)
if(strcmp(strToken,keywords[i])==0)
return(1);
 return(0);
}

Viod Retract()
{
 m--;
 ch=’ ’;

}

Viod Insertd(int code)  //将字符类型和相应的字符依次放到数组word[]中
{
strcpy(word[math].word.strToken);
word[math].code=code;
math++;

}

int MParser() //判断输入字符的类型,并返回相应的类型值
{
strcpy(strToken,””);
TakeChar();
TakeBC();
If(IsLetter())
  {
           While(IsLetter()||IsDigit())
               {
                  Concat();
                  TakeChar(); 

}
           Retract();
           If(Recover())
             Return(1);
           Return(2);
}
else if(IsDigit())
{
    while(IsDigit())
    {
        Concat();
        TakeChar();

}
Retract();
Return(3);
}
else if(ch==’+’||ch==’*’||ch==’/’||ch==’=’)  //判断是否为运算符
{
Concat();
return(4);

}
else if(ch==’<’||ch==’>’||ch==’!’)  //判断是否为运算符
{
Concat();
return(4);
}
else
{
Retract();
return(4);
}
}
else if(ch==’,’||ch==’;’||ch==’{’||ch==’}’ ||ch==’(’ ||ch==’)’)  //判断是否为分隔符
{
Concat();
return(5);


}
else //无法识别
   {
Concat();
return(0);
}
}

main()
{
Int i, j, k, row;
Char strl[p][q];
m=0;
math=0;


printf(“input and end input with line #:/n”);
row=0;
while(row<q)
{
  gets(strl[row]);
  if(strl[row][0]==’#’)
break;
  row++;

}
k=0;
for(i=0;i<row;i++)
   {
if(strl[i][0]!’\0’)
  {
for(j=0;str[i][j]!’\0’;j++)
str[k++]=str[i][j]l
str[k++]=’’;
}

}
str[k-1]=’\0’;

while(str[m]!=’\0’)
  {
   InsertId(MParser());

}
for(i=0;i<math;i++)
   printf(“(%d,%s)\n”, words[i], code, wors[i], word);
getch();

⌨️ 快捷键说明

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