?? sym.h
字號:
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <ctype.h> //for function tolower
const int RESERVE =37;
const int LINEMAX = 512;
const int BUFFER_SIZE = 4096;
typedef enum {
OPEN,NEW,QUIT,CONNECT,CREATE,ALTER, //6 for each line
SELECT,INSERT,DELETE,WHERE,UPDATE,TABLE,
USER,INTO,LIKE,ORDER,BY,NUM,
CHAR,TEXT,WRONG,IDENT,PLUS,MINUS,
TIMES,SLASH,MOD,EQL,NEQ,LSS,
LEQ,GTR,GEQ,LPAREN, RPAREN,COMMA,
QUESTION,AND,OR,NOT,DESCRIBE,INT,
LONG,FLOAT,DATE,BYTE,DATABASE,PRIMARY,
KEY,NL,ADD,DROP,END,VALUES,FROM,SET
}SYMBOL;
char RSYMS[RESERVE][10]={
"OPEN","NEW","QUIT","CONNECT","CREATE",
"ALTER","SELECT","INSERT","DELETE","WHERE",
"UPDATE","TABLE","USER","INTO","LIKE",
"ORDER","BY","MOD","AND","OR",
"NOT","DESCRIBE","CHAR","INT","LONG",
"FLOAT","DATE","BYTE","DATABASE","PRIMARY",
"KEY","NULL","ADD","DROP","VALUES",
"FROM","SET"
};
char lowerRSYMS[RESERVE][10];
SYMBOL RSYM[RESERVE]={
OPEN,NEW,QUIT,CONNECT,CREATE,
ALTER,SELECT,INSERT,DELETE,WHERE,
UPDATE,TABLE,USER,INTO,LIKE,
ORDER,BY,MOD,AND,OR,
NOT,DESCRIBE,CHAR,INT,LONG,
FLOAT,DATE,BYTE,DATABASE,PRIMARY,
KEY,NL,ADD,DROP,VALUES,
FROM,SET
};
typedef struct{
int valid;
int length;
SYMBOL type;
int nl;
int key;
int indexBlock;
char * name;
}FIELD;
typedef struct{
char * value;
SYMBOL type;
}FIELDREC;
typedef struct fieldNode{
FIELD f;
fieldNode * next;
}FIELDNODE;
void lowerString(char * source,char * result)
{
int i=0;
while(source[i]!='\0')
{
result[i] =tolower(source[i]);
i++;
}
result[i]='\0';
}
SYMBOL getSym(char * input,int & pointer,char * getText)
{
char buffer[1024];
SYMBOL type;
int bufferP=0;
while(input[pointer]==' '||input[pointer]=='\t')
pointer++;
if((input[pointer]>='a'&&input[pointer]<='z')||
(input[pointer]>='A'&&input[pointer]<='Z')) //must be a reserve word or user identifier
{
int cp1=0,cp2=1;
while((input[pointer]>='a'&&input[pointer]<='z')||
(input[pointer]>='A'&&input[pointer]<='Z')||
(input[pointer]>='0'&&input[pointer]<='9')){
buffer[bufferP]=input[pointer];
pointer++;
bufferP++;
}
type = IDENT;
buffer[bufferP]='\0';
for(int i=0;i<RESERVE;i++)
{
cp1=strcmp(buffer,RSYMS[i]);
cp2=strcmp(buffer,lowerRSYMS[i]);
if(cp1==0||cp2==0)
{
type = RSYM[i];
break;
}
}
}
else
if(input[pointer]>='0'&&input[pointer]<='9'){ //must be a num
while((input[pointer]>='0'&&input[pointer]<='9')||input[pointer]=='.'){
buffer[bufferP]=input[pointer];
pointer++;
bufferP++;
};
buffer[bufferP]='\0';
type = NUM;
}
else
switch(input[pointer++])
{
case '\'' : //bust be a text
while(input[pointer]!='\''&&input[pointer]!='\0'){
buffer[bufferP]=input[pointer];
pointer++;
bufferP++;
}
buffer[bufferP]='\0';
if(input[pointer]=='\0')
{
cout<<"\n\" expected."<<endl;
type = WRONG;
}
else{
pointer++;
type = TEXT;
}
break;
case '(':
buffer[0]='(';
buffer[1]='\0';
type = LPAREN;
break;
case ')':
buffer[0]=')';
buffer[1]='\0';
type = RPAREN;
break;
case '+':
buffer[0]='+';
buffer[1]='\0';
type = PLUS;
break;
case '-':
buffer[0]='-';
buffer[1]='\0';
type = MINUS;
break;
case '*':
buffer[0]='*';
buffer[1]='\0';
type = TIMES;
break;
case '/':
buffer[0]='/';
buffer[1]='\0';
type = SLASH;
break;
case '=':
buffer[0]='=';
buffer[1]='\0';
type = EQL;
break;
case '>':
buffer[0]='>';
if(input[pointer]=='=') // >= find
{
pointer++;
type = GEQ;
buffer[1]='=';
buffer[2]='\0';
}
else{
buffer[1]='\0';
type = GTR;
}
break;
case '<':
buffer[0]='<';
if(input[pointer]=='=') // <= find
{
pointer++;
type = LEQ;
buffer[1]='=';
buffer[2]='\0';
}
else{
buffer[1]='\0';
type = LSS;
}
break;
case '!':
buffer[0]='!';
if(input[pointer]=='=')
{
pointer++;
type = NEQ;
buffer[1]='=';
buffer[2]='\0';
}
else{
buffer[1]='\0';
type = NOT;
}
break;
case ',':
buffer[0]=',';
buffer[1]='\0';
type = COMMA;
break;
case '?':
buffer[0]='?';
buffer[1]='\0';
type = QUESTION;
break;
case ';':
buffer[0]=';';
buffer[1]='\0';
type = END;
break;
default:
cout<<"\nUnexpected symbol."<<endl;
type=WRONG;
buffer[0]=input[pointer-1];
buffer[1]='\0';
}
strcpy(getText,buffer);
return type;
}
void getinput(char * buffer)
{
char line[LINEMAX];
cin.getline(line,LINEMAX,'\n');
while(line[strlen(line)-1]!=';')
{
cout<<" ";
strcat(buffer,line);
strcat(buffer," ");
cin.getline(line,LINEMAX,'\n');
}
strcat(buffer,line);
}
void outType(SYMBOL t)
{
for(int i=0;i<RESERVE;i++)
if(t==RSYM[i])
break;
cout<<RSYMS[i];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -