private Token NextToken() { while (input.CanContinue) { switch (input.Current) { // Whitespace case ' ': case '\t': input.Advance(); break; // Newlines case '\r': case '\n': NextLine(); break; // String case '\'': case '"': return(StringLiteral(input.Current)); // Comment or minus case '-': input.StorePosition(); input.Advance(); if (input.Current != '-') { return(input.Output(Symbol.Minus)); } if (input.CanPeek && input.Peek == '[') { LongComment(); } else { ShortComment(); } break; default: // Long string if (input.Current == '[' && input.CanPeek && (input.Peek == '[' || input.Peek == '=')) { return(LongStringLiteral()); } // Hex numeric if (input.Current == '0' && input.CanPeek && (input.Peek == 'X' || input.Peek == 'x')) { return(NumericHexLiteral()); } // Numeric if (input.Current.IsDecimal() || (input.Current == '.' && input.CanPeek && input.Peek.IsDecimal())) { return(NumericLiteral()); } // Identifier or keyword if (input.Current.IsIdentifierStart()) { return(IdentifierOrKeyword()); } // Punctuation if (input.Current.IsPunctuation()) { return(Punctuation()); } throw new LuaSyntaxException(input, ExceptionMessage.UNEXPECTED_CHAR, input.Current); } } return(input.Output(Symbol.Eof)); }