diff options
author | Jon Loeliger <jdl@jdl.com> | 2008-10-03 11:46:43 -0500 |
---|---|---|
committer | Jon Loeliger <jdl@jdl.com> | 2008-10-03 11:46:43 -0500 |
commit | 83ac55d9c4669397f3f2454d3c72dd34e5de5490 (patch) | |
tree | da01d8d25532e7160650d688895dc9e5f8c47352 | |
parent | 879e4d2590b50d63f82c3c3652bc3c7900591f1c (diff) | |
download | dtc-83ac55d9c4669397f3f2454d3c72dd34e5de5490.tar.gz |
Use flex's YY_USER_ACTION feature to avoid code duplication
Current, every lexer rule starts with some boiler plate to update the
yylloc value for use by the parser. One of the rules, even mistakenly
has a redundant allocation to one of the members.
This patch uses the flex YY_USER_ACTION macro hook, which is executed
before every rule to avoid this duplication.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | dtc-lexer.l | 36 |
1 files changed, 5 insertions, 31 deletions
diff --git a/dtc-lexer.l b/dtc-lexer.l index 35b39ca..487953c 100644 --- a/dtc-lexer.l +++ b/dtc-lexer.l @@ -38,6 +38,11 @@ LINECOMMENT "//".*\n #include "srcpos.h" #include "dtc-parser.tab.h" +#define YY_USER_ACTION \ + { \ + yylloc.file = srcpos_file; \ + yylloc.first_line = yylineno; \ + } /*#define LEXDEBUG 1*/ @@ -75,18 +80,13 @@ static int pop_input_file(void); } <*>{STRING} { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("String: %s\n", yytext); yylval.data = data_copy_escape_string(yytext+1, yyleng-2); - yylloc.first_line = yylineno; return DT_STRING; } <*>"/dts-v1/" { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Keyword: /dts-v1/\n"); dts_version = 1; BEGIN_DEFAULT(); @@ -94,16 +94,12 @@ static int pop_input_file(void); } <*>"/memreserve/" { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Keyword: /memreserve/\n"); BEGIN_DEFAULT(); return DT_MEMRESERVE; } <*>{LABEL}: { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Label: %s\n", yytext); yylval.labelref = xstrdup(yytext); yylval.labelref[yyleng-1] = '\0'; @@ -111,8 +107,6 @@ static int pop_input_file(void); } <INITIAL>[bodh]# { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; if (*yytext == 'b') yylval.cbase = 2; else if (*yytext == 'o') @@ -126,32 +120,24 @@ static int pop_input_file(void); } <INITIAL>[0-9a-fA-F]+ { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; yylval.literal = xstrdup(yytext); DPRINT("Literal: '%s'\n", yylval.literal); return DT_LEGACYLITERAL; } <V1>[0-9]+|0[xX][0-9a-fA-F]+ { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; yylval.literal = xstrdup(yytext); DPRINT("Literal: '%s'\n", yylval.literal); return DT_LITERAL; } \&{LABEL} { /* label reference */ - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Ref: %s\n", yytext+1); yylval.labelref = xstrdup(yytext+1); return DT_REF; } "&{/"{PATHCHAR}+\} { /* new-style path reference */ - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; yytext[yyleng-1] = '\0'; DPRINT("Ref: %s\n", yytext+2); yylval.labelref = xstrdup(yytext+2); @@ -159,32 +145,24 @@ static int pop_input_file(void); } <INITIAL>"&/"{PATHCHAR}+ { /* old-style path reference */ - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Ref: %s\n", yytext+1); yylval.labelref = xstrdup(yytext+1); return DT_REF; } <BYTESTRING>[0-9a-fA-F]{2} { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; yylval.byte = strtol(yytext, NULL, 16); DPRINT("Byte: %02x\n", (int)yylval.byte); return DT_BYTE; } <BYTESTRING>"]" { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("/BYTESTRING\n"); BEGIN_DEFAULT(); return ']'; } <PROPNODENAME>{PROPNODECHAR}+ { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("PropNodeName: %s\n", yytext); yylval.propnodename = xstrdup(yytext); BEGIN_DEFAULT(); @@ -192,8 +170,6 @@ static int pop_input_file(void); } "/incbin/" { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Binary Include\n"); return DT_INCBIN; } @@ -203,8 +179,6 @@ static int pop_input_file(void); <*>{LINECOMMENT}+ /* eat C++-style comments */ <*>. { - yylloc.file = srcpos_file; - yylloc.first_line = yylineno; DPRINT("Char: %c (\\x%02x)\n", yytext[0], (unsigned)yytext[0]); if (yytext[0] == '[') { |