목차
없음
본문내용
= ToVar(bufindex-1);
if(varList.Find(tempvarname))
{
temp = varList.Find_value(tempvarname);
Number.push(temp);
}
else if(!varList.Find(tempvarname)) Error(4);
Get_next_token();
}
else Error(1);
}
int Process::Get_next_token()
{
while(buffer[bufindex]!='\0')
{
if('0'<=buffer[bufindex]&& buffer[bufindex] <= '9')
{
token = NUMBER;
bufindex++;
return 0;
}
else if('a'<=buffer[bufindex]&& buffer[bufindex] <= 'z')
{
token = ID;
bufindex++;
return 0;
}
else if('A'<=buffer[bufindex]&& buffer[bufindex] <= 'Z')
{
token = ID;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '=')
{
token = ASSN;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '+')
{
token = PLUS;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '-')
{
token = MINUS;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '*')
{
token = STAR;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '/')
{
token = MUL;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '(')
{
token = LP;
bufindex++;
return 0;
}
else if(buffer[bufindex] == ')')
{
token = RP;
bufindex++;
return 0;
}
else if(buffer[bufindex] == ' ' || buffer[bufindex] == '\t' || buffer[bufindex] == '\n')
{
bufindex++;
}
else
{
Error(1);
}
}
bufindex++;
return 0;
}
void Process::Parsing()
{
errchk = NO;
assignchk = ASSNNO;
helpchk = HELPNO;
for(int a=0; buffer[a] != '\0'; a++)
{
if(buffer[a] == '=') assignchk = ASSNYES;
else if(buffer[a] == '?') helpchk = HELPYES;
}
if(helpchk == HELPYES) Help(); // ' ? ' 입력시 도움말을 보여줌
else if(strcmp("history",buffer))
{
if(assignchk == ASSNYES) // ID 입력, Assign 입력을 받았을 때 작업
{
Get_next_token();
Assign();
Expr();
varList.Insert_value(assnvar,Number.top());
}
else if(assignchk == ASSNNO) // 일반 수식 계산
{
Get_next_token();
Expr();
}
// Error가 없을 경우 결과값을 출력한다.
if(errchk == NO && assignchk == ASSNNO)
cout << "Result : " << Number.pop() << endl;
else if(errchk ==NO && assignchk == ASSNYES)
cout << "Result : " << assnvar << " = " << Number.pop() << endl;
}
else if(!strcmp("history",buffer)) // "history" 입력되었을 경우
{
if(varList.Is_Empty()) cout << "Empty list." << endl;
else
varList.VarPRT();
}
}
int Process::Tonumber(int index) // 입력된 문자열에서 Number(char 형)를 int형으로 변환
{
int number;
char asciinum[30];
int j;
for(j = 0; '0' <= buffer[index] && buffer[index] <= '9'; index++,j++)
{
asciinum[j] = buffer[index];
}
asciinum[j] = '\0';
number = atoi(asciinum);
Number.push(number);
return index;
}
int Process::ToVar(int index) // 입력된 문자열에서 ID를 Variable Name으로 변환
{
char varname[11];
int j;
for(j = 0;
('a' <= buffer[index] && buffer[index] <= 'z') ||
('A' <= buffer[index] && buffer[index] <= 'Z')
; index++,j++)
{
varname[j] = buffer[index];
}
varname[j] = '\0';
strcpy(tempvarname,varname);
return index;
}
void main(void){
clrscr();
InputExp In;
Process ProcessIn;
char YesNo;
do{
In.setExp(); // Expression을 입력 받는다.
ProcessIn.getExp(In.getExp()); // Expression을 버퍼에 저장한 후
ProcessIn.Parsing(); // Parsing 작업을 통해 값을 계산한다.
cout << "Do you want to continue? ..... (Y/N)";
cin >> YesNo;
}while(YesNo == 'Y' || YesNo == 'y');
}
if(varList.Find(tempvarname))
{
temp = varList.Find_value(tempvarname);
Number.push(temp);
}
else if(!varList.Find(tempvarname)) Error(4);
Get_next_token();
}
else Error(1);
}
int Process::Get_next_token()
{
while(buffer[bufindex]!='\0')
{
if('0'<=buffer[bufindex]&& buffer[bufindex] <= '9')
{
token = NUMBER;
bufindex++;
return 0;
}
else if('a'<=buffer[bufindex]&& buffer[bufindex] <= 'z')
{
token = ID;
bufindex++;
return 0;
}
else if('A'<=buffer[bufindex]&& buffer[bufindex] <= 'Z')
{
token = ID;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '=')
{
token = ASSN;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '+')
{
token = PLUS;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '-')
{
token = MINUS;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '*')
{
token = STAR;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '/')
{
token = MUL;
bufindex++;
return 0;
}
else if(buffer[bufindex] == '(')
{
token = LP;
bufindex++;
return 0;
}
else if(buffer[bufindex] == ')')
{
token = RP;
bufindex++;
return 0;
}
else if(buffer[bufindex] == ' ' || buffer[bufindex] == '\t' || buffer[bufindex] == '\n')
{
bufindex++;
}
else
{
Error(1);
}
}
bufindex++;
return 0;
}
void Process::Parsing()
{
errchk = NO;
assignchk = ASSNNO;
helpchk = HELPNO;
for(int a=0; buffer[a] != '\0'; a++)
{
if(buffer[a] == '=') assignchk = ASSNYES;
else if(buffer[a] == '?') helpchk = HELPYES;
}
if(helpchk == HELPYES) Help(); // ' ? ' 입력시 도움말을 보여줌
else if(strcmp("history",buffer))
{
if(assignchk == ASSNYES) // ID 입력, Assign 입력을 받았을 때 작업
{
Get_next_token();
Assign();
Expr();
varList.Insert_value(assnvar,Number.top());
}
else if(assignchk == ASSNNO) // 일반 수식 계산
{
Get_next_token();
Expr();
}
// Error가 없을 경우 결과값을 출력한다.
if(errchk == NO && assignchk == ASSNNO)
cout << "Result : " << Number.pop() << endl;
else if(errchk ==NO && assignchk == ASSNYES)
cout << "Result : " << assnvar << " = " << Number.pop() << endl;
}
else if(!strcmp("history",buffer)) // "history" 입력되었을 경우
{
if(varList.Is_Empty()) cout << "Empty list." << endl;
else
varList.VarPRT();
}
}
int Process::Tonumber(int index) // 입력된 문자열에서 Number(char 형)를 int형으로 변환
{
int number;
char asciinum[30];
int j;
for(j = 0; '0' <= buffer[index] && buffer[index] <= '9'; index++,j++)
{
asciinum[j] = buffer[index];
}
asciinum[j] = '\0';
number = atoi(asciinum);
Number.push(number);
return index;
}
int Process::ToVar(int index) // 입력된 문자열에서 ID를 Variable Name으로 변환
{
char varname[11];
int j;
for(j = 0;
('a' <= buffer[index] && buffer[index] <= 'z') ||
('A' <= buffer[index] && buffer[index] <= 'Z')
; index++,j++)
{
varname[j] = buffer[index];
}
varname[j] = '\0';
strcpy(tempvarname,varname);
return index;
}
void main(void){
clrscr();
InputExp In;
Process ProcessIn;
char YesNo;
do{
In.setExp(); // Expression을 입력 받는다.
ProcessIn.getExp(In.getExp()); // Expression을 버퍼에 저장한 후
ProcessIn.Parsing(); // Parsing 작업을 통해 값을 계산한다.
cout << "Do you want to continue? ..... (Y/N)";
cin >> YesNo;
}while(YesNo == 'Y' || YesNo == 'y');
}
소개글