It's not strictly speaking a bug, but the behavior of Advance is a bit confusing.
Based on how you use it in the code snippets, I would suggest changing it to
private void Advance() {
current++;
}
So that it only does what it says, and then changing the place where you read the next char to
char c = Peek();
Advance();
Alternatively, you could rename it to something like ReadChar, which more closely matches its current behavior, since a read is expected to return the data (character) at the current position, and then advance the position