From 18f704edd0938355622049d853c1ce3cdfaee168 Mon Sep 17 00:00:00 2001 From: Marius Nita Date: Tue, 3 Sep 2002 08:57:35 +0000 Subject: [PATCH] better error reporting. epist now reports the line number and token a parser error occurs at, as well as invalid actions. --- util/epist/epist.l | 6 +++++- util/epist/epist.y | 12 +++++++---- util/epist/parser.cc | 47 +++++++++++++++++++++++++++++++++----------- util/epist/parser.hh | 1 + 4 files changed, 49 insertions(+), 17 deletions(-) diff --git a/util/epist/epist.l b/util/epist/epist.l index c3db54b8..6c7e08a5 100644 --- a/util/epist/epist.l +++ b/util/epist/epist.l @@ -8,9 +8,11 @@ #include "yacc_parser.hh" extern YYSTYPE yylval; - + %} +%option yylineno + %% \{ return OBRACE; @@ -27,6 +29,8 @@ Mod3 | mod3 | Mod4 | mod4 | +Mod5 | +mod5 | Control | control | shift | diff --git a/util/epist/epist.y b/util/epist/epist.y index d187e96f..243e4168 100644 --- a/util/epist/epist.y +++ b/util/epist/epist.y @@ -9,7 +9,10 @@ #define YYPARSE_PARAM parser_obj #define YYSTYPE char* - + +extern int yylineno; +extern char *yytext; + extern "C" { int yylex(); int yywrap() { @@ -17,14 +20,15 @@ extern "C" { } } -void yyerror(const char *c) { - printf("ERROR: %s\n", c); +void yyerror(const char *c) +{ + printf("ERROR: %s, on line %d, near %s\n", c, yylineno, yytext); } - %} %token OBRACE EBRACE SEMICOLON DASH NUMBER QUOTES WORD BINDING OPTIONS TRUE FALSE +%expect 1 %% diff --git a/util/epist/parser.cc b/util/epist/parser.cc index d1df9f1f..00be5d7e 100644 --- a/util/epist/parser.cc +++ b/util/epist/parser.cc @@ -31,12 +31,14 @@ extern "C" { #include "parser.hh" #include +#include using std::string; +using std::cout; parser::parser(keytree *kt, Config *conf) : _kt(kt), _config(conf), _mask(0), _action(Action::noaction), - _key(""), _arg("") + _key(""), _arg(""), _add(true) { } @@ -120,39 +122,56 @@ void parser::setAction(string act) if ( strcasecmp(actions[i].str, act.c_str()) == 0 ) { _action = actions[i].act; found = true; + break; } } - if (!found) - _action = Action::noaction; + if (!found) { + cout << "ERROR: Invalid action (" << act << "). Binding ignored.\n"; + _add = false; + } } void parser::addModifier(string mod) { struct { - string str; + const char *str; unsigned int mask; } modifiers[] = { - { "Mod1", Mod1Mask }, - { "Mod2", Mod2Mask }, - { "Mod3", Mod3Mask }, - { "Mod4", Mod4Mask }, - { "Control", ControlMask }, - { "Shift", ShiftMask }, + { "mod1", Mod1Mask }, + { "mod2", Mod2Mask }, + { "mod3", Mod3Mask }, + { "mod4", Mod4Mask }, + { "mod5", Mod5Mask }, + { "control", ControlMask }, + { "shift", ShiftMask }, { "", 0 } }; + bool found = false; + for (int i = 0; modifiers[i].str != ""; ++i) { - if (modifiers[i].str == mod) + if ( strcasecmp(modifiers[i].str, mod.c_str()) == 0 ) { _mask |= modifiers[i].mask; + found = true; + break; + } + } + + if (!found) { + cout << "ERROR: Invalid modifier (" << mod << "). Binding ignored.\n"; + _add = false; } } void parser::endAction() { - _kt->addAction(_action, _mask, _key, _arg); + if (_add) + _kt->addAction(_action, _mask, _key, _arg); reset(); + + _add = true; } void parser::startChain() @@ -171,6 +190,10 @@ void parser::endChain() void parser::setChainBinding() { if (_mask != 0 && _key != "") { + if (!_add) { + cout << "Error: Bad modifier detected on chain's root key.\n"; + _add = true; + } _kt->setCurrentNodeProps(Action::noaction, _mask, _key, ""); reset(); } diff --git a/util/epist/parser.hh b/util/epist/parser.hh index c12fec92..b1c02a31 100644 --- a/util/epist/parser.hh +++ b/util/epist/parser.hh @@ -73,6 +73,7 @@ private: Action::ActionType _action; std::string _key; std::string _arg; + bool _add; }; #endif //__parser_hh -- 2.39.2