private char Advance() {
return source[current++];
}
This is wrong. At least as I would expect advance to behave. While you do advance, you are returning the old value, not the new one. ++current would return the new value.
Also, it would help if you said what the wrong behaviour was.