summaryrefslogtreecommitdiff
path: root/i/marvin/src/config/parser.yy
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/config/parser.yy')
-rw-r--r--i/marvin/src/config/parser.yy175
1 files changed, 175 insertions, 0 deletions
diff --git a/i/marvin/src/config/parser.yy b/i/marvin/src/config/parser.yy
new file mode 100644
index 0000000..1aeb986
--- /dev/null
+++ b/i/marvin/src/config/parser.yy
@@ -0,0 +1,175 @@
+%{
+// robert - programme du robot 2005. {{{
+//
+// Copyright (C) 2005 Nicolas Schodet
+//
+// Robot APB Team/Efrei 2005.
+// 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.
+//
+// }}}
+#define YYPARSE_PARAM scanner
+#define YYLEX_PARAM scanner
+
+#include "config/config.hh"
+#include "config/config_data.hh"
+#include "config/parser_extra.hh"
+
+// Fichiers d'en-tête générés.
+#include "parser.hh"
+#include "lexer.hh"
+
+#include <iostream> // XXX à virer.
+
+void yyerror (const char *);
+
+#undef yyextra
+#define yyextra (yyget_extra (scanner))
+
+%}
+
+%error-verbose
+%pure-parser
+%defines
+%union {
+ char c;
+ int i;
+ double f;
+ bool b;
+ std::string *s;
+ struct {
+ any *a;
+ Config::IntList *il;
+ Config::FloatList *fl;
+ Config::StringList *sl;
+ } a;
+}
+
+%token<c> UNKNOWN
+%token<i> INT
+%token<f> FLOAT
+%token<s> ID STRING
+%token<b> BOOLEAN
+%token IMG DATA
+
+%type<a> int_list
+%type<a> float_list
+%type<a> string_list
+
+%destructor { delete $$; } ID STRING
+%destructor { delete $$.a; } int_list
+%destructor { delete $$.a; } float_list
+%destructor { delete $$.a; } string_list
+
+%%
+
+input:
+ /* Nothing. */
+ | confitem
+ | input '\n' confitem
+ | input '\n'
+;
+
+confitem:
+ ID '=' BOOLEAN {
+ yyextra->configData.add (*$1, $3);
+ delete $1;
+ }
+ | ID '=' INT {
+ yyextra->configData.add (*$1, $3);
+ delete $1;
+ }
+ | ID '=' FLOAT {
+ yyextra->configData.add (*$1, $3);
+ delete $1;
+ }
+ | ID '=' STRING {
+ yyextra->configData.add (*$1, *$3);
+ delete $1;
+ delete $3;
+ }
+ | ID '=' '(' int_list ')' {
+ yyextra->configData.add (*$1, *$4.a);
+ delete $1;
+ delete $4.a;
+ }
+ | ID '=' '(' float_list ')' {
+ yyextra->configData.add (*$1, *$4.a);
+ delete $1;
+ delete $4.a;
+ }
+ | ID '=' '(' string_list ')' {
+ yyextra->configData.add (*$1, *$4.a);
+ delete $1;
+ delete $4.a;
+ }
+;
+
+int_list:
+ INT {
+ $$.a = new any (Config::IntList ());
+ $$.il = any_cast<Config::IntList> ($$.a);
+ $$.il->push_back ($1);
+ }
+ | int_list INT {
+ $1.il->push_back ($2);
+ $$ = $1;
+ }
+;
+
+float_list:
+ FLOAT {
+ $$.a = new any (Config::FloatList ());
+ $$.fl = any_cast<Config::FloatList> ($$.a);
+ $$.fl->push_back ($1);
+ }
+ | float_list FLOAT {
+ $1.fl->push_back ($2);
+ $$ = $1;
+ }
+;
+
+string_list:
+ STRING {
+ $$.a = new any (Config::StringList ());
+ $$.sl = any_cast<Config::StringList> ($$.a);
+ $$.sl->push_back (*$1);
+ delete $1;
+ }
+ | string_list STRING {
+ $1.sl->push_back (*$2);
+ $$ = $1;
+ delete $2;
+ }
+;
+
+%%
+
+void yyerror (const char *e)
+{
+ std::cerr << e << std::endl;
+}
+
+/* Shut up warning for this wrongly declared static function. */
+static int
+yy_init_globals (yyscan_t yyscanner)
+{
+ return yy_init_globals (yyscanner);
+}
+
+/* vim:ft=yacc:
+*/