일지
인터프리터...27
niamdank
2020. 12. 15. 15:00
전자 계산기 프로그램
스택 처리, 토큰 처리
MiniCalculator.h
#pragma region 스택 처리
#define STACK_SIZE 20
int stack[STACK_SIZE];
int top;
void Push(int n)
{
if (top >= STACK_SIZE)
{
throw std::out_of_range("stack");
}
stack[top++] = n;
}
int Pop()
{
if (top <= 0)
{
throw std::out_of_range("stack");
}
return stack[--top];
}
int Peek()
{
if (top <= 0)
{
throw std::out_of_range("stack");
}
return stack[top - 1];
}
#pragma endregion
#pragma region 토큰 처리
char* current;
int ch{ ' ' };
int NextCharacter()
{
if (*current == '\0')
{
return '\0';
}
return *current++;
}
Token NextToken()
{
// 공백 스킵
while (isspace(ch))
{
ch = NextCharacter();
};
if (isdigit(ch))
{
int num{ 0 };
do
{
num = num * 10 + (ch - '0');
ch = NextCharacter();
} while (isdigit(ch));
return Token(TokenKind::Int, num);
}
if (islower(ch))
{
int num{ ch - 'a' };
ch = NextCharacter();
return Token(TokenKind::VariableName, num);
}
TokenKind tokenKind{ TokenKind::Others };
switch (ch)
{
case '(':
tokenKind = TokenKind::LeftParenthesis;
break;
case ')':
tokenKind = TokenKind::RightParenthesis;
break;
case '+':
tokenKind = TokenKind::Plus;
break;
case '-':
tokenKind = TokenKind::Minus;
break;
case '*':
tokenKind = TokenKind::Multiply;
break;
case '/':
tokenKind = TokenKind::Divide;
break;
case '=':
tokenKind = TokenKind::Assign;
break;
case '?':
tokenKind = TokenKind::Print;
break;
case '\0':
tokenKind = TokenKind::EndOfToken;
break;
}
ch = NextCharacter();
return Token(tokenKind);
}
#pragma endregion
더보기