1 /* 2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 18 * USA 19 */ 20 21 %option noyywrap nounput noinput never-interactive 22 23 %x INCLUDE 24 %x BYTESTRING 25 %x PROPNODENAME 26 %s V1 27 28 PROPNODECHAR [a-zA-Z0-9,._+*#?@-] 29 PATHCHAR ({PROPNODECHAR}|[/]) 30 LABEL [a-zA-Z_][a-zA-Z0-9_]* 31 STRING \"([^\\"]|\\.)*\" 32 WS [[:space:]] 33 COMMENT "/*"([^*]|\*+[^*/])*\*+"/" 34 LINECOMMENT "//".*\n 35 36 %{ 37 #include "dtc.h" 38 #include "srcpos.h" 39 #include "dtc-parser.tab.h" 40 41 YYLTYPE yylloc; 42 43 /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ 44 #define YY_USER_ACTION \ 45 { \ 46 srcpos_update(&yylloc, yytext, yyleng); \ 47 } 48 49 /*#define LEXDEBUG 1*/ 50 51 #ifdef LEXDEBUG 52 #define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) 53 #else 54 #define DPRINT(fmt, ...) do { } while (0) 55 #endif 56 57 static int dts_version = 1; 58 59 #define BEGIN_DEFAULT() DPRINT("<V1>\n"); \ 60 BEGIN(V1); \ 61 62 static void push_input_file(const char *filename); 63 static int pop_input_file(void); 64 %} 65 66 %% 67 <*>"/include/"{WS}*{STRING} { 68 char *name = strchr(yytext, '\"') + 1; 69 yytext[yyleng-1] = '\0'; 70 push_input_file(name); 71 } 72 73 <*><<EOF>> { 74 if (!pop_input_file()) { 75 yyterminate(); 76 } 77 } 78 79 <*>{STRING} { 80 DPRINT("String: %s\n", yytext); 81 yylval.data = data_copy_escape_string(yytext+1, 82 yyleng-2); 83 return DT_STRING; 84 } 85 86 <*>"/dts-v1/" { 87 DPRINT("Keyword: /dts-v1/\n"); 88 dts_version = 1; 89 BEGIN_DEFAULT(); 90 return DT_V1; 91 } 92 93 <*>"/memreserve/" { 94 DPRINT("Keyword: /memreserve/\n"); 95 BEGIN_DEFAULT(); 96 return DT_MEMRESERVE; 97 } 98 99 <*>{LABEL}: { 100 DPRINT("Label: %s\n", yytext); 101 yylval.labelref = xstrdup(yytext); 102 yylval.labelref[yyleng-1] = '\0'; 103 return DT_LABEL; 104 } 105 106 <V1>[0-9]+|0[xX][0-9a-fA-F]+ { 107 yylval.literal = xstrdup(yytext); 108 DPRINT("Literal: '%s'\n", yylval.literal); 109 return DT_LITERAL; 110 } 111 112 <*>\&{LABEL} { /* label reference */ 113 DPRINT("Ref: %s\n", yytext+1); 114 yylval.labelref = xstrdup(yytext+1); 115 return DT_REF; 116 } 117 118 <*>"&{/"{PATHCHAR}+\} { /* new-style path reference */ 119 yytext[yyleng-1] = '\0'; 120 DPRINT("Ref: %s\n", yytext+2); 121 yylval.labelref = xstrdup(yytext+2); 122 return DT_REF; 123 } 124 125 <BYTESTRING>[0-9a-fA-F]{2} { 126 yylval.byte = strtol(yytext, NULL, 16); 127 DPRINT("Byte: %02x\n", (int)yylval.byte); 128 return DT_BYTE; 129 } 130 131 <BYTESTRING>"]" { 132 DPRINT("/BYTESTRING\n"); 133 BEGIN_DEFAULT(); 134 return ']'; 135 } 136 137 <PROPNODENAME>{PROPNODECHAR}+ { 138 DPRINT("PropNodeName: %s\n", yytext); 139 yylval.propnodename = xstrdup(yytext); 140 BEGIN_DEFAULT(); 141 return DT_PROPNODENAME; 142 } 143 144 "/incbin/" { 145 DPRINT("Binary Include\n"); 146 return DT_INCBIN; 147 } 148 149 <*>{WS}+ /* eat whitespace */ 150 <*>{COMMENT}+ /* eat C-style comments */ 151 <*>{LINECOMMENT}+ /* eat C++-style comments */ 152 153 <*>. { 154 DPRINT("Char: %c (\\x%02x)\n", yytext[0], 155 (unsigned)yytext[0]); 156 if (yytext[0] == '[') { 157 DPRINT("<BYTESTRING>\n"); 158 BEGIN(BYTESTRING); 159 } 160 if ((yytext[0] == '{') 161 || (yytext[0] == ';')) { 162 DPRINT("<PROPNODENAME>\n"); 163 BEGIN(PROPNODENAME); 164 } 165 return yytext[0]; 166 } 167 168 %% 169 170 static void push_input_file(const char *filename) 171 { 172 assert(filename); 173 174 srcfile_push(filename); 175 176 yyin = current_srcfile->f; 177 178 yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE)); 179 } 180 181 182 static int pop_input_file(void) 183 { 184 if (srcfile_pop() == 0) 185 return 0; 186 187 yypop_buffer_state(); 188 yyin = current_srcfile->f; 189 190 return 1; 191 } 192