[4/5] dtc: Cleanup yylloc type and handling
David Gibson
david at gibson.dropbear.id.au
Fri Oct 3 00:07:53 EST 2008
This patch makes several cleanups to the handling of location
variables as they're carried through the parser. Specifically:
- (for now) remove column numbers from YYLTYPE, since we were
never correctly filling them in from the lexer in any case.
- split the 'file' field in YYLTYPE into first and last file,
since for big parser groupings the first and last token could in
theory be in different files.
- use plain strings to store the files in YYLTYPE, instead of
dtc_file pointer. There's no need for the other info from dtc_file,
and the strings will have nicer lifetime properties in future patches.
- reorganize YYLTYPE into first and last nested structure
fields, each containing a file and line number, which will be more
convenient for us later on.
- no longer use the undocumented magic #defines
YYLTYPE_IS_DECLARED and YYLTYPE_IS_TRIVIAL. Instead we define our own
structure for the locations and make YYLTYPE a macro expanding to it,
as described in the flex info pages.
- reformat the YYLLOC_DEFAULT macro into the indentation style
we use everywhere else (as well as updating it to match the other
changes)
Signed-off-by: David Gibson <david at gibson.dropbear.id.au>
---
dtc-lexer.l | 4 +--
srcpos.c | 11 +++++++--
srcpos.h | 70 ++++++++++++++++++++++--------------------------------------
3 files changed, 37 insertions(+), 48 deletions(-)
Index: dtc/srcpos.h
===================================================================
--- dtc.orig/srcpos.h 2008-10-03 00:03:57.000000000 +1000
+++ dtc/srcpos.h 2008-10-03 00:04:07.000000000 +1000
@@ -18,60 +18,42 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
-
-/*
- * Augment the standard YYLTYPE with a filenum index into an
- * array of all opened filenames.
- */
-
#include <stdio.h>
char *xstrdup(const char *s);
+struct srcpos {
+ int line;
+ const char *file;
+};
+
+struct srcloc {
+ struct srcpos first, last;
+};
+
+#define YYLTYPE struct srcloc
+
+#define YYLLOC_DEFAULT(Cur, Rhs, N) \
+ do { \
+ if (N) { \
+ (Cur).first.file = YYRHSLOC(Rhs, 1).first.file; \
+ (Cur).first.line = YYRHSLOC(Rhs, 1).first.line; \
+ (Cur).last.file = YYRHSLOC(Rhs, N).last.file; \
+ (Cur).last.line = YYRHSLOC(Rhs, N).last.line; \
+ } else { \
+ (Cur).first.line = (Cur).last.line \
+ = YYRHSLOC(Rhs, 0).last.line; \
+ (Cur).first.file = (Cur).last.file \
+ = YYRHSLOC(Rhs, 0).last.file; \
+ } \
+ } while (0)
+
struct dtc_file {
char *dir;
const char *name;
FILE *file;
};
-#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
-typedef struct YYLTYPE {
- int first_line;
- int first_column;
- int last_line;
- int last_column;
- struct dtc_file *file;
-} YYLTYPE;
-
-#define YYLTYPE_IS_DECLARED 1
-#define YYLTYPE_IS_TRIVIAL 1
-#endif
-
-/* Cater to old parser templates. */
-#ifndef YYID
-#define YYID(n) (n)
-#endif
-
-#define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- (Current).file = YYRHSLOC (Rhs, N).file; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- (Current).file = YYRHSLOC (Rhs, 0).file; \
- } \
- while (YYID (0))
-
void srcpos_error(YYLTYPE *loc, char const *fmt, ...)
__attribute__((format(printf, 2, 3)));
Index: dtc/dtc-lexer.l
===================================================================
--- dtc.orig/dtc-lexer.l 2008-10-03 00:03:48.000000000 +1000
+++ dtc/dtc-lexer.l 2008-10-03 00:04:07.000000000 +1000
@@ -39,8 +39,8 @@ LINECOMMENT "//".*\n
#define YY_USER_ACTION \
{ \
- yylloc.file = srcpos_file; \
- yylloc.first_line = yylineno; \
+ yylloc.first.file = yylloc.last.file = srcpos_file->name; \
+ yylloc.first.line = yylloc.last.line = yylineno; \
}
/*#define LEXDEBUG 1*/
Index: dtc/srcpos.c
===================================================================
--- dtc.orig/srcpos.c 2008-10-03 00:03:57.000000000 +1000
+++ dtc/srcpos.c 2008-10-03 00:04:07.000000000 +1000
@@ -29,12 +29,19 @@ char *xstrdup(const char *s)
return dup;
}
-void srcpos_error(YYLTYPE *loc, char const *fmt, ...)
+void srcpos_error(struct srcloc *loc, char const *fmt, ...)
{
va_list va;
va_start(va, fmt);
- fprintf(stderr, "%s:%d ", loc->file->name, loc->first_line);
+ if (!streq(loc->first.file, loc->last.file))
+ fprintf(stderr, "%s:%d-%s:%d ", loc->first.file, loc->first.line,
+ loc->last.file, loc->last.line);
+ else if (loc->first.line != loc->last.line)
+ fprintf(stderr, "%s:%d-%d ", loc->first.file, loc->first.line,
+ loc->last.line);
+ else
+ fprintf(stderr, "%s:%d ", loc->first.file, loc->first.line);
vfprintf(stderr, fmt, va);
fprintf(stderr, "\n");
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
More information about the devicetree-discuss
mailing list