glcpp: Add plumbing to support line locations.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 16 Jun 2010 23:35:57 +0000 (16:35 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Jun 2010 18:31:55 +0000 (11:31 -0700)
glcpp/glcpp-lex.l
glcpp/glcpp-parse.y
glcpp/glcpp.h

index a04e0fabdf8772b359376381acb491f3586da1f7..f17336974e6ed1972994e91be6b2b9b0a7faca89 100644 (file)
@@ -29,7 +29,7 @@
 #include "glcpp-parse.h"
 %}
 
-%option bison-bridge reentrant noyywrap
+%option bison-bridge bison-locations reentrant noyywrap
 %option extra-type="glcpp_parser_t *"
 %option prefix="glcpp_"
 
index c5c03b68fbd6d166cbe2933927a910a86cd42111..52927d83c6cc4975f4b63303a511ae6a85b0bbfb 100644 (file)
@@ -34,7 +34,7 @@
        stream = talloc_asprintf_append(stream, fmt, args)
 
 static void
-yyerror (glcpp_parser_t *parser, const char *error);
+yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error);
 
 static void
 _define_object_macro (glcpp_parser_t *parser,
@@ -133,7 +133,7 @@ _glcpp_parser_skip_stack_pop (glcpp_parser_t *parser);
 #define yylex glcpp_parser_lex
 
 static int
-glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser);
+glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser);
 
 static void
 glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list);
@@ -142,6 +142,7 @@ glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list);
 
 %pure-parser
 %error-verbose
+%locations
 
 %parse-param {glcpp_parser_t *parser}
 %lex-param {glcpp_parser_t *parser}
@@ -364,7 +365,7 @@ text_line:
 
 non_directive:
        pp_tokens NEWLINE {
-               yyerror (parser, "Invalid tokens after #");
+               yyerror (& @1, parser, "Invalid tokens after #");
        }
 ;
 
@@ -861,9 +862,10 @@ _token_list_print (glcpp_parser_t *parser, token_list_t *list)
 }
 
 void
-yyerror (glcpp_parser_t *parser, const char *error)
+yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error)
 {
-       glcpp_printf(parser->errors, "Parse error: %s\n", error);
+       glcpp_printf(parser->errors, "%u:%u(%u): preprocessor error: %s\n",
+                    locp->source, locp->first_line, locp->first_column, error);
 }
 
 glcpp_parser_t *
@@ -1452,13 +1454,13 @@ _define_function_macro (glcpp_parser_t *parser,
 }
 
 static int
-glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser)
+glcpp_parser_lex (YYSTYPE *yylval, YYLTYPE *yylloc, glcpp_parser_t *parser)
 {
        token_node_t *node;
        int ret;
 
        if (parser->lex_from_list == NULL) {
-               ret = glcpp_lex (yylval, parser->scanner);
+               ret = glcpp_lex (yylval, yylloc, parser->scanner);
 
                /* XXX: This ugly block of code exists for the sole
                 * purpose of converting a NEWLINE token into a SPACE
index 3441ab863275688683d342f487bff7e3d7dffcc1..1d139af064fbb23108909257146fd44cf3d2b57f 100644 (file)
@@ -59,6 +59,16 @@ typedef union YYSTYPE
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
 
+typedef struct YYLTYPE {
+   int first_line;
+   int first_column;
+   int last_line;
+   int last_column;
+   unsigned source;
+} YYLTYPE;
+# define YYLTYPE_IS_DECLARED 1
+# define YYLTYPE_IS_TRIVIAL 1
+
 struct token {
        int type;
        YYSTYPE value;
@@ -163,7 +173,7 @@ void
 glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader);
 
 int
-glcpp_lex (YYSTYPE *lvalp, yyscan_t scanner);
+glcpp_lex (YYSTYPE *lvalp, YYLTYPE *llocp, yyscan_t scanner);
 
 int
 glcpp_lex_destroy (yyscan_t scanner);