📄 data.h
字号:
//#include<iostream.h>
//#include<ctype.h>
//#include<fstream.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
//#include<string.h>
#include<iomanip>
#include "MyAnylise.h"
using namespace std;
//*******************************************************************************
int CMyAnylise::judgeYunsuan(char a)
{
for(int i=0;i<20;i++)
{
if(a==yunsuanfu[i])
{
i=100;
}
}
if(i==20)
{
return 0;
}
else
return 1;
}
int CMyAnylise::isFenge(char a)
{
for(int i=0;i<20;i++)
{
if(a==fengefu[i])
{
i=100;
}
}
if(i==20)
{
return 0;
}
else
return 1;
}
void CMyAnylise::number(char w)
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
tokenval=w-'0';
w=PopChar();
while(isdigit(w))/*整型数字处理*/
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
tokenval=tokenval*10+w-'0';
w=PopChar();
}
// wordlist[wordlist_count].mark[0]='n';///做记号;
if(w=='.')/*浮点型数字处理*/
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
w=PopChar();
int i=0;
while(isdigit(w))/*在数字范围内*/
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
tokenval=tokenval*10+w-'0';
i++;
w=PopChar();
}
if(w==' '||w=='\n'||w=='\t'||w=='F'||w=='f'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w=='/')
{ if(w=='\n')
{
line++;
}
tokenfloat=(float)tokenval;
for(int j=1;j<=i;j++)
{
tokenfloat=tokenfloat/10;
}
wordlist[wordlist_count].kind=2;
wordlist[wordlist_count].pointer=constant_count;
strcpy(wordlist[wordlist_count].mark,"num");
if(w=='f'||w=='F')
{
wordlist[wordlist_count].name[name_count]=w;
}
constant[constant_count].value=tokenfloat;
name_count=0;
wordlist_count++;
constant_count++;
if(w!='f'&&w!='F')
{
ungetc(w,stdin);
}
//cout<<"Report : "<< tokenfloat<<" 是合法浮点数字!"<<endl;
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&!isFenge(w))
{
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
{
line++;
}
if(judgeYunsuan(w)||isFenge(w))
{
ungetc(w,stdin);
}
name_count=0;
cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
wordlist[wordlist_count].kind=-1;
wordlist_count++;
}
}
else if(w=='e'||w=='E')
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
w=PopChar();
int token=0;
while(isdigit(w))/*在数字范围内*/
{
wordlist[wordlist_count].name[name_count]=w;name_count++;
token=token*10+w-'0';
w=PopChar();
}
if(w==' '||w=='\t'||w=='\n'||judgeYunsuan(w)||isFenge(w))
{
if(w=='\n')
{
line++;
}
else
ungetc(w,stdin);
tokenfloat=(float)tokenval;
for(int j=0;j<token;j++)
{
tokenfloat=tokenfloat*10;
}
wordlist[wordlist_count].kind=2;
wordlist[wordlist_count].pointer=constant_count;
strcpy(wordlist[wordlist_count].mark,"n");
constant[constant_count].value=tokenfloat;
name_count=0;
wordlist_count++;
constant_count++;
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&!isFenge(w))
{
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
{
line++;
}
else if(judgeYunsuan(w)||isFenge(w))
{
ungetc(w,stdin);
}
name_count=0;
cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
wordlist[wordlist_count].kind=-1;
wordlist_count++;
}
}
else if(w==' '||w=='\n'||w=='\t'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w==')'||w=='/'||w=='%')/*正确的整型数字*/
{
if(w=='\n')
{
line++;
}
else
{
ungetc(w,stdin);
}
wordlist[wordlist_count].name[name_count]='\0';
name_count=0;
wordlist[wordlist_count].kind=2;
wordlist[wordlist_count].pointer=constant_count;
strcpy(wordlist[wordlist_count].mark,"n");
constant[constant_count].value=(float)tokenval;
wordlist_count++;
constant_count++;
//cout<<"Report : "<<tokenval<< " 是合法整型数字!"<<endl;
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&!isFenge(w))
{
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
{
line++;
}
else
{
ungetc(w,stdin);
}
name_count=0;
cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
wordlist[wordlist_count].kind=-1;
wordlist_count++;
}
}
//*******************************************************************************************
void CMyAnylise::symbolJudge(char w)
{
int i=0;
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
while((isdigit(w))||(w>=65&&w<=90)||(w>=97&&w<=122)||(w=='_'))
{
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w==' '||w=='\n'||w=='\t'||judgeYunsuan(w)||isFenge(w))
{
if(w=='\n')
{
line++;
}
else
ungetc(w,stdin);//回退一个字符。
for(i=0;i<32;i++)
{
if(strcmp(wordlist[wordlist_count].name,key[i])==0)
{
name_count=0;
wordlist[wordlist_count].kind=3;
wordlist[wordlist_count].pointer=key_count;
if(strcmp(wordlist[wordlist_count].name,"CREATE")==0)
{
strcpy(wordlist[wordlist_count].mark,"c");
}
if(strcmp(wordlist[wordlist_count].name,"TABLE")==0)
{
strcpy(wordlist[wordlist_count].mark,"t");
}
if(strcmp(wordlist[wordlist_count].name,"INTEGER")==0||strcmp(wordlist[wordlist_count].name,"INT")==0)
{
strcpy(wordlist[wordlist_count].mark,"i");
}
if(strcmp(wordlist[wordlist_count].name,"CHAR")==0||strcmp(wordlist[wordlist_count].name,"VARCHAR")==0)
{
strcpy(wordlist[wordlist_count].mark,"a");
}
if(strcmp(wordlist[wordlist_count].name,"ALTER")==0)
{
strcpy(wordlist[wordlist_count].mark,"l");
}
if(strcmp(wordlist[wordlist_count].name,"ADD")==0)
{
strcpy(wordlist[wordlist_count].mark,"d");
}
if(strcmp(wordlist[wordlist_count].name,"DROP")==0)
{
strcpy(wordlist[wordlist_count].mark,"r");
}
if(strcmp(wordlist[wordlist_count].name,"INDEX")==0)
{
strcpy(wordlist[wordlist_count].mark,"x");
}
if(strcmp(wordlist[wordlist_count].name,"VIEW")==0)
{
strcpy(wordlist[wordlist_count].mark,"v");
}
if(strcmp(wordlist[wordlist_count].name,"SELECT")==0)
{
strcpy(wordlist[wordlist_count].mark,"s");
}
if(strcmp(wordlist[wordlist_count].name,"FROM")==0)
{
strcpy(wordlist[wordlist_count].mark,"f");
}
if(strcmp(wordlist[wordlist_count].name,"WHERE")==0)
{
strcpy(wordlist[wordlist_count].mark,"w");
}
if(strcmp(wordlist[wordlist_count].name,"AND")==0)
{
strcpy(wordlist[wordlist_count].mark,"a");
}
if(strcmp(wordlist[wordlist_count].name,"OR")==0)
{
strcpy(wordlist[wordlist_count].mark,"o");
}
if(strcmp(wordlist[wordlist_count].name,"INSERT")==0)
{
strcpy(wordlist[wordlist_count].mark,"i");
}
if(strcmp(wordlist[wordlist_count].name,"INTO")==0)
{
strcpy(wordlist[wordlist_count].mark,"t");
}
if(strcmp(wordlist[wordlist_count].name,"VALUES")==0)
{
strcpy(wordlist[wordlist_count].mark,"v");
}
if(strcmp(wordlist[wordlist_count].name,"UPDATE")==0)
{
strcpy(wordlist[wordlist_count].mark,"u");
}
if(strcmp(wordlist[wordlist_count].name,"SET")==0)
{
strcpy(wordlist[wordlist_count].mark,"s");
}
if(strcmp(wordlist[wordlist_count].name,"DELETE")==0)
{
strcpy(wordlist[wordlist_count].mark,"d");
}
if(strcmp(wordlist[wordlist_count].name,"GRANT")==0)
{
strcpy(wordlist[wordlist_count].mark,"a");
}
if(strcmp(wordlist[wordlist_count].name,"REVOKE")==0)
{
strcpy(wordlist[wordlist_count].mark,"r");
}
if(strcmp(wordlist[wordlist_count].name,"ON")==0)
{
strcpy(wordlist[wordlist_count].mark,"o");
}
if(strcmp(wordlist[wordlist_count].name,"TO")==0)
{
strcpy(wordlist[wordlist_count].mark,"t");
}
if(strcmp(wordlist[wordlist_count].name,"AS")==0)
{
strcpy(wordlist[wordlist_count].mark,"a");
}
constant[constant_count].value=tokenfloat;
wordlist_count++;
key_count++;
i=100;
}
}
if(i==32)
{
name_count=0;
wordlist[wordlist_count].kind=1;
wordlist[wordlist_count].pointer=symbol_count;
strcpy(wordlist[wordlist_count].mark,"g");
strcpy(symbol[symbol_count].name,wordlist[wordlist_count].name);
wordlist_count++;
symbol_count++;
}
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&isFenge(w))
{
wordlist[wordlist_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
{
line++;
}
else
ungetc(w,stdin);
name_count=0;
cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
wordlist[wordlist_count].kind=-1;
wordlist_count++;
}
}
//**********************************************************************************
void CMyAnylise::elseSymbol(char w)
{
int i=0,j;
wordlist[wordlist_count].name[name_count]=w;name_count++;
for(i=0;i<20;i++) //运算符识别.
{
if(w==yunsuanfu[i])
{ char ch=w;
w=PopChar();
if((w=='&')||(w=='|')||(w=='=')||(w=='+')||(w=='-'))//对“==”“++”等分析;
{
if(ch==w)
{
wordlist[wordlist_count].kind=5;
wordlist[wordlist_count].name[name_count]=w;name_count++;
strcpy(wordlist[wordlist_count].mark,"r");
wordlist_count++;
name_count=0;
i=100;
}
if((ch=='!')&&(w=='='))
{
wordlist[wordlist_count].kind=5;
wordlist[wordlist_count].name[name_count]=w;name_count++;
strcpy(wordlist[wordlist_count].mark,"r");
wordlist_count++;
name_count=0;
i=100;
}
}
else if(w==' '||w=='\n'||w=='\t')
{
if(w=='\n')
{
line++;
}
name_count=0;
wordlist[wordlist_count].kind=5;
strcpy(wordlist[wordlist_count].mark,"r");
wordlist_count++;
i=100;
}
else if(w=='<'||w=='>'||w=='*'||w=='/'||w=='%'||w=='!'||w=='~')//判断非法连续运算符错误;
{
wordlist[wordlist_count].name[name_count]=w;
wordlist[wordlist_count].kind=-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -