Esempio n. 1
0
        public object VisitPrintStmt(Stmt.Print stmt)
        {
            object value = Evaluate(stmt.Expr);

            Ture.Print(value.ToString());

            return(null);
        }
Esempio n. 2
0
        public string Interpret(ICollection <Stmt> statements)
        {
            try
            {
                foreach (var statement in statements)
                {
                    Execute(statement);
                }
            }
            catch (RuntimeError error)
            {
                Ture.RuntimeError(error);
            }

            return(null);
        }
Esempio n. 3
0
        private void ScanToken()
        {
            char c = Advance();

            switch (c)
            {
            case '(': AddToken(LEFT_PAREN); break;

            case ')': AddToken(RIGHT_PAREN); break;

            case '{': AddToken(LEFT_BRACE); break;

            case '}': AddToken(RIGHT_BRACE); break;

            case ',': AddToken(COMMA); break;

            case '.': AddToken(DOT); break;

            case '-': AddToken(MINUS); break;

            case '+': AddToken(PLUS); break;

            case ';': AddToken(SEMICOLON); break;

            case '*': AddToken(STAR); break;

            case '!': AddToken(Match('=') ? EXCLAMATION_EQUAL : EXCLAMATION); break;

            case '=': AddToken(Match('=') ? EQUAL_EQUAL : EQUAL); break;

            case '<': AddToken(Match('=') ? LESS_EQUAL : LESS); break;

            case '>': AddToken(Match('=') ? GREATER_EQUAL : GREATER); break;

            case '&':
                if (Match('&'))
                {
                    AddToken(AND);
                }
                else
                {
                    Ture.Report(line, null, "Unexpected character.");
                }
                break;

            case '|':
                if (Match('|'))
                {
                    AddToken(OR);
                }
                else
                {
                    Ture.Report(line, null, "Unexpected character.");
                }
                break;

            case '/':
                if (Match('/'))
                {
                    while (Peek() != '\n' && !IsAtEnd())
                    {
                        Advance();
                    }
                }
                else
                {
                    AddToken(SLASH);
                };
                break;

            case ' ':
            case '\r':
            case '\t':
                break;

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

            case '"': String(); break;

            default:
                if (IsDigit(c))
                {
                    Number();
                }
                else if (IsAlpha(c))
                {
                    Identifier();
                }
                else
                {
                    Ture.Report(line, null, "Unexpected character.");
                }
                break;
            }
        }
Esempio n. 4
0
        private ParseError Error(Token token, string message)
        {
            Ture.Error(token, message);

            return(new ParseError());
        }