From 8f486613be58ced269db1d437e560c16558604e8 Mon Sep 17 00:00:00 2001 From: becquet Date: Thu, 10 May 2007 18:49:20 +0000 Subject: Création de chuck, le programme du robot 2007. --- i/chuck/src/interpreter/test_interpreter.cc | 139 ++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 i/chuck/src/interpreter/test_interpreter.cc (limited to 'i/chuck/src/interpreter/test_interpreter.cc') diff --git a/i/chuck/src/interpreter/test_interpreter.cc b/i/chuck/src/interpreter/test_interpreter.cc new file mode 100644 index 0000000..631d10d --- /dev/null +++ b/i/chuck/src/interpreter/test_interpreter.cc @@ -0,0 +1,139 @@ +// test_interpreter.cc +// marvin - programme du robot 2006. {{{ +// +// Copyright (C) 2006 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} +#include "interpreter.hh" + +#include +#include +#include + +class TestInterpreter +{ + Interpreter t; + public: + void funcA (const Interpreter::Args &a, bool dryrun) + { + if (!dryrun) + std::cout << " a " << a << std::endl; + } + bool funcB (void) + { + std::cout << " b ( )" << std::endl; + return true; + } + int funcC (int i) + { + std::cout << " c ( " << i << " )" << std::endl; + return 0; + } + void funcD (const std::string &s) + { + std::cout << " d ( " << s << " )" << std::endl; + } + void funcE (int i, const std::string &s, double d) + { + std::cout << " e ( " << i << ' ' << s << ' ' << d << " )" << std::endl; + } + void call (const std::string &s, const Interpreter::Args &a) + { + try + { + std::cout << "call " << s << ' ' << a << std::endl; + t.call (s, a); + } + catch (const std::exception &e) + { + // Do not use std::cerr as there should be only normal errors. + std::cout << ' ' << e.what () << std::endl; + } + } + void interpretString (const std::string &s) + { + try + { + std::cout << "interpret dry \"" << s << "\"" << std::endl; + t.interpretString (s, true); + std::cout << "interpret \"" << s << "\"" << std::endl; + t.interpretString (s); + } + catch (const std::exception &e) + { + // Do not use std::cerr as there should be only normal errors. + std::cout << ' ' << e.what () << std::endl; + } + } + int main (void) + { + // Add functions. + t.add ("a", Interpreter::memFunc (*this, &TestInterpreter::funcA), + "a ARGS...\n" + "the wonderful `a' function taking any number of any arguments"); + t.add ("b", Interpreter::memFunc (*this, &TestInterpreter::funcB), + "b\ntakes no argument"); + t.add ("c", Interpreter::memFunc (*this, &TestInterpreter::funcC), + "c THE_MIGHTY_NUMBER\n" + "takes one integer"); + t.add ("d", Interpreter::memFunc (*this, &TestInterpreter::funcD), + "d THE_STRING\n" + "takes one string"); + t.add ("e", Interpreter::memFunc (*this, &TestInterpreter::funcE), + "e INT STRING DOUBLE\n" + "takes one integer, one string and one double"); + // Make argument lists. + Interpreter::Args a[4]; + a[1].push_back (71117); + a[2].push_back (std::string ("robert")); + a[3].push_back (42); + a[3].push_back (std::string ("merguez")); + a[3].push_back (51.1664); + // Need help? + std::cout << t.help () << std::endl; + // Call all those wonderful functions. + call ("unknown", a[0]); + for (unsigned int i = 0; i < sizeof (a) / sizeof (a[0]); ++i) + { + for (char f = 'a'; f <= 'e'; f++) + { + call (std::string (1, f), a[i]); + } + } + // Now, with the interpreter. + interpretString ("a = 42"); + interpretString ("42"); + for (char f = 'a'; f <= 'e'; f++) + { + interpretString (std::string (1, f)); + interpretString (std::string (1, f) + " 42 "); + interpretString (std::string (1, f) + " \"robert\";; "); + interpretString (std::string (1, f) + " 757 \"tintin\" 0.3141516e+1"); + } + return 0; + } +}; + +int main (void) +{ + TestInterpreter tt; + return tt.main (); +} -- cgit v1.2.3