private void HandleString() { while (Peek() != '"' && !IsAtEnd) { if (Peek() == '\n') { _line++; } Advance(); } if (IsAtEnd) { // Unterminated string. SharpLox.Error(_line, "Unterminated string."); return; } // The closing ". Advance(); var value = _source.Substring(_start + 1, _current - _start - 2); AddToken(TokenType.String, value); }
static void Main(string[] args) { if (args.Length > 1) { Console.WriteLine("Usage: sharplox [script]"); Environment.Exit(64); } SharpLox.InitializeInterpreter(args); }
private void ScanToken() { var c = Advance(); switch (c) { case '(': AddToken(TokenType.LeftParen); break; case ')': AddToken(TokenType.RightParen); break; case '{': AddToken(TokenType.LeftBrace); break; case '}': AddToken(TokenType.RightBrace); break; case ',': AddToken(TokenType.Comma); break; case '.': AddToken(TokenType.Dot); break; case '-': AddToken(TokenType.Minus); break; case '+': AddToken(TokenType.Plus); break; case ';': AddToken(TokenType.Semicolon); break; case '*': AddToken(TokenType.Star); break; case '!': AddToken(Match('=') ? TokenType.BangEqual : TokenType.Bang); break; case '=': AddToken(Match('=') ? TokenType.EqualEqual : TokenType.Equal); break; case '<': AddToken(Match('=') ? TokenType.LessEqual : TokenType.Less); break; case '>': AddToken(Match('=') ? TokenType.GreaterEqual : TokenType.Greater); break; case '/': if (Match('/')) { // A comment goes until the end of the line. while (Peek() != '\n' && !IsAtEnd) { Advance(); } } else { AddToken(TokenType.Slash); } break; case ' ': case '\r': case '\t': // Ignore whitespace. break; case '\n': _line++; break; case '"': HandleString(); break; default: if (IsDigit(c)) { HandleNumber(); } else if (IsAlpha(c)) { HandleIdentifier(); } else { SharpLox.Error(_line, $"Unexpected character: {c}"); } break; } }