예제 #1
0
        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);
        }
예제 #2
0
 static void Main(string[] args)
 {
     if (args.Length > 1)
     {
         Console.WriteLine("Usage: sharplox [script]");
         Environment.Exit(64);
     }
     SharpLox.InitializeInterpreter(args);
 }
예제 #3
0
        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;
            }
        }