]> Dogcows Code - chaz/openbox/commitdiff
better error reporting. epist now reports the line number and token a parser error...
authorMarius Nita <marius@cs.pdx.edu>
Tue, 3 Sep 2002 08:57:35 +0000 (08:57 +0000)
committerMarius Nita <marius@cs.pdx.edu>
Tue, 3 Sep 2002 08:57:35 +0000 (08:57 +0000)
util/epist/epist.l
util/epist/epist.y
util/epist/parser.cc
util/epist/parser.hh

index c3db54b8120cea77867de794fc58f791ffef1257..6c7e08a5acdb567bba9b7bd03d43b0f2de297517 100644 (file)
@@ -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 |
index d187e96f0c2f19c5da9222b46b0f83452df40813..243e416877c5ca8f268efd198c68b2bb00c9d02d 100644 (file)
@@ -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
 
 %%
 
index d1df9f1ff1b2416cbf067b68887197b8c8dedb54..00be5d7e9fe8da72f6b0183a29a5bcccaf410ea1 100644 (file)
@@ -31,12 +31,14 @@ extern "C" {
 
 #include "parser.hh"
 #include <string>
+#include <iostream>
 
 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();
   }
index c12fec9211ca48034d587a004ed397fddc91c641..b1c02a319a0d03c397be3d49ea34a66958078c6e 100644 (file)
@@ -73,6 +73,7 @@ private:
   Action::ActionType _action;
   std::string _key;
   std::string _arg;
+  bool _add;
 };
 
 #endif //__parser_hh
This page took 0.026774 seconds and 4 git commands to generate.