Beispiel #1
0
        private void handleString()
        {
            while (peek() != '"' && !isAtEnd)
            {
                if (peek() == '\n')
                {
                    line++;
                }
                advanceScanner();
            }

            if (isAtEnd)
            {
                LooxSharp.error(line, "Unterminated string.");
                return;
            }

            //The closing "
            advanceScanner();

            //Remove the " "
            string value = source.Substring(start + 1, current - start - 2);

            addToken(TokenType.STRING, value);
        }
 public void interpret(Expr expr)
 {
     try
     {
         object value = evaluate(expr);
         Console.WriteLine(stringify(value));
     }
     catch (RuntimeError err)
     {
         LooxSharp.runtimeError(err);
     }
 }
Beispiel #3
0
        private void scanToken()
        {
            char c = advanceScanner();

            switch (c)
            {
            //Single characters
            case '(': addToken(TokenType.LEFT_PARNTH); break;

            case ')': addToken(TokenType.RIGHT_PARNTH); break;

            case '{': addToken(TokenType.LEFT_BRACE); break;

            case '}': addToken(TokenType.RIGHT_BRACE); 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;

            //Double characters
            case '!': addToken(match('=') ? TokenType.EXCLAM_EQUAL : TokenType.EXCLAM); break;

            case '=': addToken(match('=') ? TokenType.EQUAL_EQUAL : TokenType.EQUAL); break;

            case '<': addToken(match('=') ? TokenType.LESS_EQUAL : TokenType.LESS); break;

            case '>': addToken(match('=') ? TokenType.GREATER_EQUAL : TokenType.GREATER); break;

            //Divide and comment
            case '/':
                if (match('/'))
                {
                    while (peek() != '\n' && !isAtEnd)
                    {
                        advanceScanner();
                    }
                }
                else
                {
                    addToken(TokenType.SLASH);
                }
                break;

            //Whitespace
            case ' ':
                break;

            case '\t':
                break;

            case '\r':
                break;

            case '\n':
                line++;
                break;

            //Handle strings
            case '"': handleString(); break;

            default:
                //Check for digits (for number literals)
                if (basicIsDigit(c))
                {
                    handleNumber();
                }
                else if (basicIsAlpha(c))
                {
                    handleIdentifier();
                }
                else
                {
                    LooxSharp.error(line, "Unexpected character.");
                }
                break;
            }
        }
Beispiel #4
0
 private ParseError error(Token token, string msg)
 {
     LooxSharp.error(token, msg);
     return(new ParseError());
 }