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

📄 analyse.cpp

📁 刚写的编译原理的词法分析程序
💻 CPP
字号:
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;

#define MAXLEN 30
#define MAX 2000
int k = 0;

enum Keyword
{
	Identifier,			//  Identifier 字母 | Identifier 数字|字母
	Integer,			// 数字  |Integer 数字
	NotSym,				// 'not'
	GOp,				// '>'
	GeOp,				// '>='
	LeOp,				// '<='
	LessOp,				// '<'
	EqOp,				// '=='
	AddOp,				// '+'
	MinusOp,			// '-'
	MulOp,				// '*'
	DivOp,				// '/'
	LBracket,			// '('
	RBracket,			// ')'
	LSBracket,			// '['
	RSBracket,			// ']'
	AndOp,				// 'and'
	OrOp,				// 'or'
	XorOp,				// 'xor'
	AssignSym,			// '='
	SemicolSym,			// ';'
	ColonSym,			// ':'
	CommaSym,			// ','
	FullStopSym,		// '.'
	VarKey,				// 'var'
	IntKey,				// 'int'
	ArrayKey,			// 'array'
	BeginKey,			// 'begin'
	EndKey,				// 'end'
	IfKey,				// 'if'
	EndIfKey,			// 'fi'
	ElseKey,			// 'else'
	ThenKey,			// 'then'
	WhileKey,			// 'while'
	DoKey,				// 'do'
	ReadKey,			// 'read'
	WriteKey,			// 'write'
	OfKey,				// 'of'
	FunKey,				// 'function'
	CallKey				// 'call'
};


struct PropertyWord
{
	Keyword keyword;
	char *text;
	int row;
	int column;
};

PropertyWord *Array = new PropertyWord[MAX];
//char *KEYWORD = {"not","and","or","xor","var","int","array","begin","end","if","fi","else","then",
//"while","do","read","wtite","of","function","call"} ;

int isAlpha(char c)							//是否是字母
{
	if((c>='a' && c<='z') || (c>='A' && c<='Z'))
		return 1;
	else 
		return 0;
}

int isDigit(char c)							//辅助判断是否是数字的函数
{
	if(c>='0' && c<='9')
		return 1;
	else
		return 0;
}



Keyword property(char* string)
{
	char *p1 = "not";
	if(!strcmp(string, p1))
		return NotSym;
	char *p2 = "and";
	if(!strcmp(string, p2))
		return AndOp;
	char *p3 = "or";
	if(!strcmp(string, p3))
		return OrOp;
	char *p4 = "xor";
	if(!strcmp(string, p4))
		return XorOp;
	char *p5 = "var";
	if(!strcmp(string, p5))
		return VarKey;
	char *p6 = "int";
	if(!strcmp(string, p6))
		return IntKey;
	char *p7 = "array";
	if(!strcmp(string, p7))
		return ArrayKey;
	char *p8 = "begin";
	if(!strcmp(string, p8))
		return BeginKey;
	char *p9 = "end";
	if(!strcmp(string, p9))
		return EndKey;
	char *p0 = "if";
	if(!strcmp(string, p0))
		return IfKey;
	char *pA = "fi";
	if(!strcmp(string, pA))
		return EndIfKey;
	char *pB = "else";
	if(!strcmp(string, pB))
		return ElseKey;
	char *pC = "then";
	if(!strcmp(string, pC))
		return ThenKey;
	char *pD = "while";
	if(!strcmp(string, pD))
		return WhileKey;
	char *pE = "do";
	if(!strcmp(string, pE))
		return DoKey;
	char *pF = "read";
	if(!strcmp(string, pF))
		return ReadKey;
	char *pG = "write";
	if(!strcmp(string, pG))
		return WriteKey;
	char *pH = "of";
	if(!strcmp(string, pH))
		return OfKey;
	char *pI = "function";
	if(!strcmp(string, pI))
		return FunKey;
	char *pJ = "call";
	if(!strcmp(string, pJ))
		return CallKey;
	else
		return Identifier;
}
void scanner(FILE *fp)
{
	char string[MAXLEN];
	char ch;
	int i=1,j=1,m=0;
	while(!feof(fp))
	{	
		
		m = 0;
		ch = fgetc(fp);
		if(isAlpha(ch))
		{
			Array[k].row = i;
			Array[k].column = j;
			while(isAlpha(ch))
			{
				string[m] = ch;
				m++;
				j++;
				ch = fgetc(fp);
			}
			if(!isDigit(ch))
			{
				string[m] = '\0';
				char *str = new char[m];
				for(int p=0; p<=m; p++)
					str[p] = string[p];
				Array[k].keyword = property(str);
				Array[k].text = str;
				k++;
			}
			else
			{
				while(isDigit(ch))
				{
					string[m] = ch;
					m++;
					j++;
					ch = fgetc(fp);
				}
				string[m] = '\0';
				char *str = new char[m];
				for(int p=0; p<=m; p++)
					str[p] = string[p];
				Array[k].keyword = Identifier;
				Array[k].text = str;				
				k++;
			}
			fseek(fp,-1,1);
		}
		else if (isDigit(ch))
		{
			Array[k].row = i;
			Array[k].column = j;
			while(isDigit(ch))
			{
				string[m] = ch;
				m++;
				j++;
				ch = fgetc(fp);
			}
			string[m] = '\0';
			char *str = new char[m];
			for(int p=0; p<=m; p++)
				str[p] = string[p];
			fseek(fp,-1,1);
			Array[k].keyword = Integer;
			Array[k].text = str;
			k++;
		}
		else if(ch ==' ')
		{
			j++;continue;
		}
		else if(ch =='	')
		{
			j+=4;
			continue;
		}
		else if(ch == '\n')
		{
			j = 1;
			i++;
			continue;
		}
		else 
		{
			switch (ch)
			{
				case '>':
					ch = fgetc(fp);
					Array[k].row = i;
					Array[k].column = j;
					if(ch == '=')
					{
						Array[k].keyword = GeOp;
						Array[k].text = ">=";
						j++;
					}
					else 
					{
						Array[k].keyword  = GOp;
						Array[k].text = ">";
						fseek(fp,-1,1);
					}
					j++;
					k++;
					break;
				case '<':
					ch = fgetc(fp);
					Array[k].row = i;
					Array[k].column = j;
					if(ch == '=')
					{
						Array[k].keyword = LeOp;
						Array[k].text = "<=";
						j++;
					}
					else
					{
						Array[k].keyword = LessOp;
						Array[k].text = "<";
						fseek(fp,-1,1);
					}
					j++;
					k++;
					break;
				case '=':
					ch = fgetc(fp);
					Array[k].row = i;
					Array[k].column = j;
					if(ch == '=')
					{
						Array[k].keyword = EqOp;
						Array[k].text = "==";
						j++;
					}
					else
						fseek(fp,-1,1);
					j++;
					k++;
					break;
				case ':':
					ch = fgetc(fp);
					Array[k].row = i;
					Array[k].column = j;
					if(ch == '=')
					{
						Array[k].keyword = AssignSym;
						Array[k].text = ":=";
						j++;
					}
					else
					{
						Array[k].keyword = ColonSym;
						Array[k].text = ":";
						fseek(fp,-1,1);
					}
					j++;
					k++;
					break;
				case '+':
					Array[k].keyword = AddOp;
					Array[k].text = "+";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '-':
					Array[k].keyword = MinusOp;
					Array[k].text = "-";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '*':
					Array[k].keyword = MulOp;
					Array[k].text = "*";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '/':
					Array[k].keyword = DivOp;
					Array[k].text = "/";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '(':
					Array[k].keyword = LBracket;
					Array[k].text = "(";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case ')':
					Array[k].keyword = RBracket;
					Array[k].text  = ")";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '[':
					Array[k].keyword = LSBracket;
					Array[k].text = "[";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case ']':
					Array[k].keyword = RSBracket;
					Array[k].text = "]";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case ';':
					Array[k].keyword = SemicolSym;
					Array[k].text = ";";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case ',':
					Array[k].keyword = CommaSym;
					Array[k].text = ",";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
				case '.':
					Array[k].keyword = FullStopSym;
					Array[k].text = ".";
					Array[k].row = i;
					Array[k].column = j;
					j++;
					k++;
					break;
			}
			
			
		}
	}	
}
/*void report_error(char ERR_CH)        //错误处理程序
{
	printf("undeclared identifler %c int %d line!\n",ERR_CH,graphnum);
}*/

int main(int argc,char *argv[])
{
	FILE *fp = fopen("e:\\try.txt","r");
	int sum = 0;
	
/*	try
	{
		if(argc!=2)
			throw argc;
		fp=fopen(argv[1],"r");
		if(!fp)
			throw argv[1];
	 }
	 catch(char *str)
	 {
		cout<<"打开文件 : ";
		exit(1);
	 }
	 catch(int)
	 {
		  cout<<"请输入一个文件名!";
		  exit(1);
	 }*/
	scanner(fp);
	for (int i = 0;i<k;i++)
	{
		switch(Array[i].keyword)
		{
			case 0:
				cout<<"Identifier";break;
			case 1:
				cout<<"Integer"<<"	";break;
			case 2:
				cout<<"NotSym";break;
			case 3:
				cout<<"GOp"<<"	";break;
			case 4:
				cout<<"GeOp"<<"	";break;
			case 5:
				cout<<"LeOp"<<"	";break;
			case 6:
				cout<<"LessOp";break;
			case 7:
				cout<<"EqOp";break;
			case 8:
				cout<<"AddOp"<<"	";break;
			case 9:
				cout<<"MinusOp";break;
			case 10:
				cout<<"MulOp"<<"	";break;
			case 11:
				cout<<"DivOp";break;
			case 12:
				cout<<"LBracket";break;
			case 13:
				cout<<"RBracket";break;
			case 14:
				cout<<"LSBracket";break;
			case 15:
				cout<<"RSBracket";break;
			case 16:
				cout<<"AndOp"<<"	";break;
			case 17:
				cout<<"OrOp"<<"	";break;
			case 18:
				cout<<"XorOp<<"	"";break;
			case 19:
				cout<<"AssignSym";break;
			case 20:
				cout<<"SemicolSym";break;
			case 21:
				cout<<"colonSym";break;
			case 22:
				cout<<"CommaSym";break;
			case 23:
				cout<<"FullStopSym";break;
			case 24:
				cout<<"VarKey"<<"	";break;
			case 25:
				cout<<"IntKey"<<"	";break;
			case 26:
				cout<<"ArrayKey";break;
			case 27:
				cout<<"BeginKey";break;
			case 28:
				cout<<"EndKey"<<"	";break;
			case 29:
				cout<<"IfKey"<<"	";break;
			case 30:
				cout<<"EndIfKey";break;
			case 31:
				cout<<"ElseKey";break;
			case 32:
				cout<<"ThenKey";break;
			case 33:
				cout<<"WhileKey";break;
			case 34:
				cout<<"DoKey"<<"	";break;
			case 35:
				cout<<"ReadKey";break;
			case 36:
				cout<<"WriteKey";break;
			case 37:
				cout<<"OfKey"<<"	";break;
			case 38:
				cout<<"FunKey";break;
			case 39:
				cout<<"CallKey";break;
		}
		cout<<"	";
		cout<<"\""<<Array[i].text<<"\"";
		cout<<"	"<<Array[i].row;
		cout<<"	"<<Array[i].column<<endl;
	}
	fclose(fp);
	return 0;
}
/*

void scanner_example(FILE *fp)
{
 char ch;
 int i,c;
 
 while(!feof(fp))
 {

 ch=fgetc(fp);
 if(isalpha(ch))  
 {
  TOKEN[0]=ch;
  ch=fgetc(fp);
  i=1;
  while(isalnum(ch))  
  {
   TOKEN[i]=ch;
   i++;
   ch=fgetc(fp);
  }
  TOKEN[i]='\0';
  fseek(fp,-1,1);
  c=lookup(TOKEN);
  if(c==0) 
   out (ID,TOKEN);
  else
   out (c," ");
 }
 else if(isdigit(ch))
 {
  TOKEN[0]=ch;
  ch=fgetc(fp);
  i=1;
  while(isdigit(ch))
  {
   TOKEN[i]=ch;
   i++;
   ch=fgetc(fp);
  }
  TOKEN[i]='\0';
  fseek(fp,-1,1);
  out(INT,TOKEN);
 }
 else
  switch(ch)
  {
   case '<': ch=fgetc(fp);
      if(ch=='=') 
       out(LE," ");
      else if(ch=='>') 
       out(NE," ");
      else
      {
       fseek(fp,-1,1);
       out(LT," ");
      }
      break;
   case '=': out(EQ, " "); break;
   case '>': ch=fgetc(fp);
      if(ch=='=')
       out(GE," ");
      else
      {
       fseek(fp,-1,1);
       out(GT," ");
      }
      break;
   case ':': ch=fgetc(fp);
         if(ch=='=')              // := 为赋值语句
       out(FZ," ");
      else
      {
       fseek(fp,-1,1);
       report_error(ch);
      }
      break;
   case '/': ch=fgetc(fp);   //删除程序中的注释
      if(ch=='/')
      {
       do
       {
        ch=fgetc(fp);
       }while(ch!='\n');
       graphnum++;
      }
      else
      {
       fseek(fp,-1,1);
       out(DEV," ");
      }
      break;
   case ' ' : break;                 //删除程序中的空格              
   case '\n': graphnum++; break;   //删除程序中的回车,并记录程序编译到第几行            
   case ' ': break;      //删除程序中的横向制表符
   case -1 : break;      //删除文件尾符号
   default : report_error(ch);
     break;
  }

 }
 return;
}
#include <stdio.h>

 

struct KeyWord        //关键字结构
{
 char *word;
 int id;
};

KeyWord keyword[]={    //关键字数组
 {"begin",1},
 {"end",2},
 {"if",3},
 {"then",4},
 {"else",5},
 {"integer",16},
 {"float",17},
 {"double",18}
};


char TOKEN[20];
int graphnum=1;     //记录错误所在的位置


int lookup(char *string);
void out(int id ,char *string);
void report_error(char ERR_CH);
bool isalpha(char c) ;
bool isdigit(char c);
bool isalnum(char c);
void scanner_example(FILE *fp);

 

int lookup(char *string)
{
	for(int i=0;i 
	{
		if(strcmp(string,keyword[i].word)==0)
			return keyword[i].id;
	}
	return 0;
}

void out(int id ,char *string)
{
	printf("(%d,%s)\n",id,string);
}

void report_error(char ERR_CH)        //错误处理程序
{
 printf("undeclared identifler %c int %d line!\n",ERR_CH,graphnum);
}

bool isalpha(char c)   
{
	if( (c>='a'&&c<='z') || (c>='A'&&c<='Z') )
		return true;
	else
		return false;
}

bool isInterger(char c)
{
	if(c>='0' && c<='9')
		return true;
	else
		return false;
}

bool isalnum(char c)
{
	if( isalpha(c) || isdigit(c) )
		return true;
	else
		return false;
}

void scanner_example(FILE *fp)
{
 char ch;
 int i,c;
 
 while(!feof(fp))
 {

 ch=fgetc(fp);
 if(isalpha(ch))  
 {
  TOKEN[0]=ch;
  ch=fgetc(fp);
  i=1;
  while(isalnum(ch))  
  {
   TOKEN[i]=ch;
   i++;
   ch=fgetc(fp);
  }
  TOKEN[i]='\0';
  fseek(fp,-1,1);
  c=lookup(TOKEN);
  if(c==0) 
   out (ID,TOKEN);
  else
   out (c," ");
 }
 else if(isdigit(ch))
 {
  TOKEN[0]=ch;
  ch=fgetc(fp);
  i=1;
  while(isdigit(ch))
  {
   TOKEN[i]=ch;
   i++;
   ch=fgetc(fp);
  }
  TOKEN[i]='\0';
  fseek(fp,-1,1);
  out(INT,TOKEN);
 }
 else
  switch(ch)
  {
   case '<': ch=fgetc(fp);
      if(ch=='=') 
       out(LE," ");
      else if(ch=='>') 
       out(NE," ");
      else
      {
       fseek(fp,-1,1);
       out(LT," ");
      }
      break;
   case '=': out(EQ, " "); break;
   case '>': ch=fgetc(fp);
      if(ch=='=')
       out(GE," ");
      else
      {
       fseek(fp,-1,1);
       out(GT," ");
      }
      break;
   case ':': ch=fgetc(fp);
         if(ch=='=')              // := 为赋值语句
       out(FZ," ");
      else
      {
       fseek(fp,-1,1);
       report_error(ch);
      }
      break;
   case '/': ch=fgetc(fp);   //删除程序中的注释
      if(ch=='/')
      {
       do
       {
        ch=fgetc(fp);
       }while(ch!='\n');
       graphnum++;
      }
      else
      {
       fseek(fp,-1,1);
       out(DEV," ");
      }
      break;
   case ' ' : break;                 //删除程序中的空格              
   case '\n': graphnum++; break;   //删除程序中的回车,并记录程序编译到第几行            
   case ' ': break;      //删除程序中的横向制表符
   case -1 : break;      //删除文件尾符号
   default : report_error(ch);
     break;
  }

 }
 return;
}
void main(int argc,char *argv[])
{
 FILE *fp;

 try
 {
  if(argc!=2)
   throw argc;
  fp=fopen(argv[1],"r");
  if(!fp)
   throw argv[1];
  
 }
 
 catch(char *str)
 {
  cout<<"打开文件 : "<  exit(1);
 }

 catch(int)
 {
  cout<<"请输入一个文件名!"<  exit(1);
 }


 scanner_example(fp);

 fclose (fp);
}
*/

⌨️ 快捷键说明

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