Exemplo n.º 1
0
 Option<Term> term(TokenStream& tokens) {
     Option<Term> current = singleTerm(tokens);
     if (current.exists()) {
         while (tokens.good() && tokens->type != Token::CLOSE_BRACKET) {
             Option<Term> next = singleTerm(tokens);
             if (next.exists()) {
                 current = Option<Term>(applicationTerm(*current, *next));
             } else return next;
         }
         return current;
     } else return current;
 }
Exemplo n.º 2
0
        Option<Term> lambdaTerm(TokenStream& tokens) {
            assert(tokens->type == Token::LAMBDA);
            tokens.advance();

            if (tokens->type == Token::IDENTIFIER) {
                string id = tokens->identifierValue;
                tokens.advance();
                Option<Term> body = term(tokens);
                if (body.exists()) {
                    return Option<Term>(lambdaTerm(id, *body));

                } else return body;
            } else return errorTerm("expected identifier");
        }
Exemplo n.º 3
0
    bool run(istream& source, istream& /*in*/, ostream& out, ostream& err,
             const InterpreterSettings& settings) {
        bool ok = true;
        while (ok && source.good()) {
            if (settings.interactive) out << "> ";
            string line;
            getline(source, line, ';');
            Option<Term> term = evalLine(line);

            if (term.exists()) {
                err << *term << endl;
            } else {
                err << "[Error] eval fail... " << term.errorMessage() << endl;
                ok = false;
            }
        }
        return ok;
    }