ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터프리터...27
    일지 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

     

    댓글

Designed by Tistory.