switch (c)
{ case '&&' : symbol = AND; break; //case label value exceeds maximum value for type [enabled by default]
case '-' : symbol = MINUS; break;
case '(' : symbol = LPAR; break;
case ')' : symbol = RPAR; break;}
'&&' is a character literal that occupies usually four bytes (because it has type int) while type character has size of one byte. So variable c defined as char can not be equal to the character literal '&&'. And the compiler reports you about that.
Since a "char" (signed or unsigned) can hold only one character, you would have to check each character individually if you're using a "switch". Discarding the "switch" in favour of "if" isn't really ideal due to the compilers ability to effectively optimise the "switch" with a jump-table. "if" statements, however, are more difficult for the compiler to optimise.