[gobject-introspection] scanner: more verbose parser error messages



commit 58de797638c54954d56862b58c4ec78a57485131
Author: Stefan Kost <ensonic users sf net>
Date:   Sat Dec 5 23:00:32 2009 +0200

    scanner: more verbose parser error messages
    
    Keep track of the current line (the first 2000 chars of it) and include that in
    syntax error messages. Also print that failed token in the error message.

 giscanner/scannerlexer.l  |    8 +++++++-
 giscanner/scannerparser.y |    5 +++--
 2 files changed, 10 insertions(+), 3 deletions(-)
---
diff --git a/giscanner/scannerlexer.l b/giscanner/scannerlexer.l
index cee9160..ff1ee0f 100644
--- a/giscanner/scannerlexer.l
+++ b/giscanner/scannerlexer.l
@@ -37,6 +37,7 @@
 #include "grealpath.h"
 
 int lineno;
+char linebuf[2000];
 
 #undef YY_BUF_SIZE
 #define YY_BUF_SIZE 1048576
@@ -61,7 +62,12 @@ stringtext				([^\\\"])|(\\.)
 
 %%
 
-"\n"					{ ++lineno; } /* " */
+\n.*					{ strncpy(linebuf, yytext+1, sizeof(linebuf)); /* save the next line */
+						linebuf[sizeof(linebuf)-1]='\0';
+						/* printf("%4d:%s\n",lineno,linebuf); */
+						yyless(1);      /* give back all but the \n to rescan */
+						++lineno;
+					}
 "\\\n"					{ ++lineno; }
 [\t\f\v\r ]+				{ /* Ignore whitespace. */ }
 
diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y
index c92a538..7b18f94 100644
--- a/giscanner/scannerparser.y
+++ b/giscanner/scannerparser.y
@@ -38,6 +38,7 @@
 
 extern FILE *yyin;
 extern int lineno;
+extern char linebuf[2000];
 extern char *yytext;
 
 extern int yylex (GISourceScanner *scanner);
@@ -1281,8 +1282,8 @@ yyerror (GISourceScanner *scanner, const char *s)
    * have valid expressions */
   if (!scanner->macro_scan)
     {
-      fprintf(stderr, "%s:%d: %s\n",
-	      scanner->current_filename, lineno, s);
+      fprintf(stderr, "%s:%d: %s in '%s' at '%s'\n",
+	      scanner->current_filename, lineno, s, linebuf, yytext);
     }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]