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

📄 a1.cpp

📁 编译原理第一次实验---语法分析实验
💻 CPP
字号:
#include<fstream.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
int i,j,k,flag,number,status;
/*status which is use to judge the string is keywords or not!*/
char ch;
char words[10] = {" "};
char program[1000];
int Scan(char program[])
{
    char *keywords[21] = {"program","type","var","produce","begin","end",
"array","of","record","if","then","else","fi","while","do",
"endwh","read","write","return","integer","char"};
number = 0;
status   = 0;
j      = 0;
ch     = program[i++];
       /* To handle the lettle space ands tab*/

      /*handle letters*/
if (((ch >= 'a') && (ch <= 'z' ))||((ch >= 'A') && (ch <= 'Z' ))||((ch >= '0') && (ch <= '9')))
{
while (((ch >= 'a') && (ch <= 'z' ))||((ch >= 'A') && (ch <= 'Z' ))||((ch >= '0') && (ch <= '9')))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++] = '\0';
       for (k = 0; k < 21; k++)
if (strcmp (words,keywords[k]) == 0)
switch(k)
{
case 0:{
flag = 1;
status = 1;
break;
}
case 1:{
flag = 2;
status = 1;
break;
}
case 2:{
flag = 3;
status = 1;
break;
}
case 3:{
flag = 4;
status = 1;
break;
}
case 4:{
flag = 5;
status = 1;
break;
}
case 5:{
flag = 6;
status = 1;
break;
       }
case 6:{
flag = 7;
status = 1;
break;
       }
case 7:{
flag = 8;
status = 1;
break;
       }
case 8:{
flag = 9;
status = 1;
break;
       }
case 9:{
flag = 10;
status = 1;
break;
       }
case 10:{
flag = 11;
status = 1;
break;
}
case 11:{
flag = 12;
status = 1;
break;
}
case 12:{
flag = 13;
status = 1;
break;
}
case 13:{
flag = 14;
status = 1;
break;
}
case 14:{
flag = 15;
status = 1;
break;
}
case 15:{
flag = 16;
status = 1;
break;
}
case 16:{
flag = 17;
status = 1;
break;
}
case 17:{
flag = 18;
status = 1;
break;
}
case 18:{
flag = 19;
status = 1;
break;
}
case 19:{
flag = 20;
status = 1;
break;
}
case 20:{
flag = 21;
status = 1;
break;
}
}
   if (status == 0)
   {
      flag = 100;
   }
}
/*handle digits*/
else if ((ch >= '0') && (ch <= '9'))
{
number = 0;
while ((ch >= '0' ) && (ch <= '9' ))
{
number = number*10+(ch-'0');
ch     = program[i++];
}
flag = 200;
i--;
}
/*opereation and edge handle*/
/*else if (((words[0]>= 'a') && (words[0] <= 'z' ))||((words[0] >= 'A') && (words[0] <= 'Z' )))
{
while (((ch >= 'a') && (ch <= 'z' ))||((ch >= 'A') && (ch <= 'Z' ))||((ch >= '0') && (ch <= '9'))||(ch='_'))
{
	//words[j++]=ch;
	ch=program[i++];
}
flag=300;
}*/
else switch (ch)
{
case '=':{
words[j++] = ch;
words[j]   = '\0';
flag       = 413;
break;
}
case'<':{
words[j++] = ch;
words[j]   = '\0';
flag       = 414;
break;
}
case'+':{
words[j++] = ch;
words[j]   = '\0';
flag       = 415;
break;
}
case'-':{
words[j++] = ch;
words[j]   = '\0';
flag       = 416;
break;
}
case'*':{
words[j++] = ch;
words[j]   = '\0';
flag       = 417;
break;
}
case'/':{
words[j++] = ch;
words[j]   = '\0';
flag       = 418;
break;
}
case';':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 419;
break;
}
case'(':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 420;
break;
}
case')':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 421;
break;
}
case'[':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 422;
break;
}
case']':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 423;
break;
}
case'{':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 424;
break;
}
case'}':{
words[j]   = ch;
words[j+1] = '\0';
flag       = 425;
break;
}
case',':{
words[j] = ch;
words[j+1] = '\0';
flag       = 428;
break;
}
case':':{
if (ch == ':')
       words[j++] = ch;
       words[j]   = '\0';
       ch         = program[i++];
       if (ch == '=')
       {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 429;
       }
       else
       {
       i--;
       flag       = 426;
       }
break;
}
case'.':{
if (ch == '.')
       words[j++] = ch;
       words[j]   = '\0';
       ch         = program[i++];
       if (ch == '.')
       {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 427;
       }
       else
       {
       i--;
       flag       = 430;
       }
break;
}
case'@':{
words[j] = '#';
flag = 0;
break;
}
default:{
flag = -1;
break;
}
}
return flag;
}
void main()
{
/*ofstream outfile;
outfile.open("f:\by.txt",ios::out);
if(outfile.open("f:\by.txt",ios::out)==0)
{cout<<"open error"<<endl;}
else{*/
i=0;
do
{
ch = getchar();
program[i++] = ch;
}while(ch != '@');
i = 0;
do{
flag = Scan(program);
char *a[21] = {"PROGRAM","TYPE","VAR","PRODUCE","BEGIN","END",
"ARRAY","OF","RECORD","IF","THEN","ELSE","FI","WHILE","DO",
"ENDWH","READ","WRITE","RETURN","INTEGER","CHAR"};
char *b[18] = {"EQ","LT","PLUS","MINUS","TIMES","OVER","SEMI",
"LPAREN","RPAREN","LMIDPAREN","RMIDPAREN","LBIGDPAREN","RBIGDPAREN",
"COLON","UNDERANGE","COMMA","ASSIGN","DOT"};
if ((flag>=1)&&(flag<=21))
{
	cout<<words<<"       "<<a[flag-1]<<"  保留字"<<endl;
}
else if ((flag>=413)&&(flag<=429))
{
	cout<<words<<"       "<<b[flag-413]<<"  分界符"<<endl;
}
else if (flag==430)
{
	cout<<words<<"        "<<b[flag-413]<<"      程序结束符"<<endl;
	cout<<"        EOF"<<"       文件结束符"<<endl;
}
else if (flag == 200)
{
    cout<<number<<"       INTC"<<"  常数"<<endl;
}
else if (flag ==100)
{
	cout<<words<<"       ID"<<"  标识符"<<endl;
}
else if (flag == -1)
{
cout<<"";
}
}
while (flag != 0);
    system("pause");
//}
//	outfile.close();
}

⌨️ 快捷键说明

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