diff mbox

[57/90] assembler: Add location support

Message ID 1359991705-5254-58-git-send-email-damien.lespiau@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lespiau, Damien Feb. 4, 2013, 3:27 p.m. UTC
Let's generate location information about the tokens we are parsing.
This can be used to give accurate location when reporting errors and
warnings.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 assembler/gram.y |    1 +
 assembler/lex.l  |   24 ++++++++++++++++++------
 2 files changed, 19 insertions(+), 6 deletions(-)
diff mbox

Patch

diff --git a/assembler/gram.y b/assembler/gram.y
index 8b56bd9..9a4e510 100644
--- a/assembler/gram.y
+++ b/assembler/gram.y
@@ -276,6 +276,7 @@  static void resolve_subnr(struct brw_reg *reg)
 
 
 %}
+%locations
 
 %start ROOT
 
diff --git a/assembler/lex.l b/assembler/lex.l
index 626042f..769d98b 100644
--- a/assembler/lex.l
+++ b/assembler/lex.l
@@ -9,6 +9,15 @@ 
 int saved_state = 0;
 extern char *input_filename;
 
+/* Locations */
+int yycolumn = 1;
+
+#define YY_USER_ACTION						\
+	yylloc.first_line = yylloc.last_line = yylineno;	\
+	yylloc.first_column = yycolumn;				\
+	yylloc.last_column = yycolumn+yyleng-1;			\
+	yycolumn += yyleng;
+
 %}
 %x BLOCK_COMMENT
 %x CHANNEL
@@ -16,11 +25,11 @@  extern char *input_filename;
 %x FILENAME
 
 %%
-\/\/.*[\r\n] { } /* eat up single-line comments */
-"\.kernel".*[\r\n] { }
-"\.end_kernel".*[\r\n] { }
-"\.code".*[\r\n] { }
-"\.end_code".*[\r\n] { }
+\/\/.*[\r\n] { yycolumn = 1; } /* eat up single-line comments */
+"\.kernel".*[\r\n] { yycolumn = 1; }
+"\.end_kernel".*[\r\n] { yycolumn = 1; }
+"\.code".*[\r\n] { yycolumn = 1; }
+"\.end_code".*[\r\n] { yycolumn = 1; }
 
  /* eat up multi-line comments, non-nesting. */
 \/\* {
@@ -33,6 +42,7 @@  extern char *input_filename;
 <BLOCK_COMMENT>. { }
 <BLOCK_COMMENT>[\r\n] { }
 "#line"" "* { 
+	yycolumn = 1;
 	saved_state = YYSTATE;
 	BEGIN(LINENUMBER);
 }
@@ -407,7 +417,9 @@  yylval.integer = BRW_CHANNEL_W;
 	return NUMBER;
 }
 
-[ \t\n]+ { } /* eat up whitespace */
+[ \t]+ { } /* eat up whitespace */
+
+\n { yycolumn = 1; }
 
 . {
 	fprintf(stderr, "%s: %d: %s at \"%s\"\n",