📄 analyse.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 + -