1 %{ 2 /*---------------------------------------------------------------------------* 3 Project: TwlSDK - tools - makelcf 4 File: spec.l 5 6 Copyright 2003-2008 Nintendo. All rights reserved. 7 8 These coded instructions, statements, and computer programs contain 9 proprietary information of Nintendo of America Inc. and/or Nintendo 10 Company Ltd., and are protected by Federal copyright law. They may 11 not be disclosed to third parties or copied or duplicated in any form, 12 in whole or in part, without the prior written consent of Nintendo. 13 14 $Date:: 2011-04-15#$ 15 $Rev: 11409 $ 16 $Author: okubata_ryoma $ 17 *---------------------------------------------------------------------------*/ 18 #include <stdio.h> 19 #include <string.h> 20 #include "makelcf.h" 21 #include "defval.h" 22 #include "spec.tab.h" 23 24 #define RETURN(x) { debug_printf( "%s [%s]\n", #x, spec_yytext ); return(x); } 25 26 static void YYText_ResolveDevVal( void ); 27 static char* getSection( void ); 28 29 30 %} 31 32 ws [ \t] 33 nl \r?\n 34 identifier [A-Za-z_][A-Za-z_0-9]* 35 decnum -?[1-9][0-9]* 36 octnum -?0[0-7]* 37 hexnum -?0[xX][0-9A-Fa-f]+ 38 qstring \"[^\"\n\r]*\" 39 string_wo_ws [^ \t\n\r]+ 40 41 %s START 42 %s PARAM 43 %s PARAM_CONTINUE 44 %option pointer 45 %option yylineno 46 %option noyywrap 47 %% 48 49 //====================================================================== 50 // SPEC TOKENS 51 //====================================================================== 52 53 #.* ; /* Comment */ 54 \/\/.* ; /* Comment */ 55 56 <INITIAL>.* { 57 YYText_ResolveDevVal(); 58 BEGIN START; 59 } 60 61 <PARAM_CONTINUE>.* { 62 YYText_ResolveDevVal(); 63 BEGIN PARAM; 64 } 65 66 <START>(Static|STATIC|static) { BEGIN PARAM; RETURN(tSTATIC); } 67 <START>(Autoload|AUTOLOAD|autoload) { BEGIN PARAM; RETURN(tAUTOLOAD); } 68 <START>(Overlay|OVERLAY|overlay) { BEGIN PARAM; RETURN(tOVERLAY); } 69 <START>(Ltd|LTD|ltd)(Autoload|AUTOLOAD|autoload) { BEGIN PARAM; RETURN(tLTDAUTOLOAD); } 70 <START>(Ltd|LTD|ltd)(Overlay|OVERLAY|overlay) { BEGIN PARAM; RETURN(tLTDOVERLAY); } 71 <START>(Property|PROPERTY|property) { BEGIN PARAM; RETURN(tPROPERTY); } 72 <START>(Properties|PROPERTIES|properties) { BEGIN PARAM; RETURN(tPROPERTY); } 73 74 <START>(Group|GROUP|group) { BEGIN PARAM; RETURN(tGROUP); } 75 <START>(Address|ADDRESS|address) { BEGIN PARAM; RETURN(tADDRESS); } 76 <START>(After|AFTER|after) { BEGIN PARAM; RETURN(tAFTER); } 77 <START>(Object|OBJECT|object)[sS]? { BEGIN PARAM; RETURN(tOBJECT); } 78 <START>(Librar|LIBRAR|librar)(y|Y|ies|IES)? { BEGIN PARAM; RETURN(tLIBRARY); } 79 <START>(Search|SEARCH|search)_?(Symbol|SYMBOL|symbol)[sS]? { BEGIN PARAM; RETURN(tSEARCHSYMBOL); } 80 <START>(Force|FORCE|force) { BEGIN PARAM; RETURN(tFORCE); } 81 <START>(StackSize|STACKSIZE|stacksize) { BEGIN PARAM; RETURN(tSTACKSIZE); } 82 <START>(Compress|COMPRESS|compress) { BEGIN PARAM; RETURN(tCOMPRESS); } 83 84 <START>(OverlayDefs|OVERLAYDEFS|overlaydefs) { BEGIN PARAM; RETURN(tOVERLAYDEFS); } 85 <START>(OverlayTable|OVERLAYTABLE|overlaytable) { BEGIN PARAM; RETURN(tOVERLAYTABLE); } 86 <START>(Ltd|LTD|ltd)(OverlayDefs|OVERLAYDEFS|overlaydefs) { BEGIN PARAM; RETURN(tLTDOVERLAYDEFS); } 87 <START>(Ltd|LTD|ltd)(OverlayTable|OVERLAYTABLE|overlaytable) { BEGIN PARAM; RETURN(tLTDOVERLAYTABLE); } 88 <START>(Sur?ffix|SUR?FFIX|sur?ffix) { BEGIN PARAM; RETURN(tSUFFIX); } 89 <START>(Flx|FLX|flx)(Sur?ffix|SUR?FFIX|sur?ffix) { BEGIN PARAM; RETURN(tFLXSUFFIX); } 90 <START>(Ltd|LTD|ltd)(Sur?ffix|SUR?FFIX|sur?ffix) { BEGIN PARAM; RETURN(tLTDSUFFIX); } 91 92 <PARAM>(ITCM|itcm|Itcm) { 93 spec_yylval.string = strdup("ITCM"); 94 RETURN(tSTRING_ID); 95 } 96 97 <PARAM>(DTCM|dtcm|Dtcm) { 98 spec_yylval.string = strdup("DTCM"); 99 RETURN(tSTRING_ID); 100 } 101 102 <PARAM>(WRAM|wram|Wram) { 103 spec_yylval.string = strdup("WRAM"); 104 RETURN(tSTRING_ID); 105 } 106 107 <PARAM>(SMART|smart|Smart) { 108 spec_yylval.string = strdup("SMART"); 109 RETURN(tSTRING_ID); 110 } 111 112 <PARAM>(EXCLUSION|exclusion|Exclusion) { 113 spec_yylval.string = strdup("EXCLUSION"); 114 RETURN(tSTRING_ID); 115 } 116 117 <START>\{ { BEGIN PARAM; RETURN(tBEGIN); } 118 <START>\} { BEGIN PARAM; RETURN(tEND); } 119 120 <PARAM>{ws}*\\{ws}*{nl} { BEGIN PARAM_CONTINUE; } /* Continue to next line */ 121 122 <PARAM>\({identifier}*\,{ws}[A-Za-z_][A-Za-z_0-9\.]*\.[oa]\) { 123 spec_yylval.string = strdup(spec_yytext); 124 RETURN(tSTRING_FORCE); 125 } 126 127 <PARAM>\({ws}*\.[a-zA-Z_0-9]*{ws}*\) { 128 spec_yylval.string = getSection(); 129 RETURN(tSECTIONNAME); 130 } 131 132 <PARAM>\({ws}*\.[a-zA-Z_0-9]*\.[a-zA-Z_0-9]*{ws}*\) { 133 spec_yylval.string = getSection(); 134 RETURN(tSECTIONNAME); 135 } 136 137 <PARAM>\* { 138 spec_yylval.string = strdup(spec_yytext); 139 RETURN(tSTRING_STAR); 140 } 141 142 <PARAM>GROUP\([^\)]*\) { 143 spec_yylval.string = strdup(spec_yytext); 144 RETURN(tSTRING_GROUP); 145 } 146 147 <PARAM>OBJECT\([^\)]*\) { 148 spec_yylval.string = strdup(spec_yytext); 149 RETURN(tSTRING_FUNCTION); 150 } 151 152 {decnum} | 153 {octnum} | 154 {hexnum} { /* Integer Value */ 155 spec_yylval.integer = strtol((char*)spec_yytext, (char**)NULL, 0); 156 RETURN(tNUMBER); 157 } 158 159 {identifier} { /* String for identifier */ 160 spec_yylval.string = strdup(spec_yytext); 161 RETURN(tSTRING_ID); 162 } 163 164 {qstring} { /* String quated by "" */ 165 spec_yytext[spec_yyleng-1] = '\0'; 166 spec_yylval.string = strdup(spec_yytext+1); 167 RETURN(tSTRING_QUATED); 168 } 169 170 {string_wo_ws} { /* String without white space */ 171 spec_yylval.string = strdup(spec_yytext); 172 RETURN(tSTRING_NOSPACE); 173 } 174 175 <PARAM><<EOF>> { BEGIN INITIAL; RETURN(tNL); } /* End of File */ 176 177 {nl} { BEGIN INITIAL; RETURN(tNL); } /* Newline */ 178 {ws}+ ; /* White space */ 179 . { RETURN(spec_yytext[0]); } /* Default */ 180 181 %% 182 183 /*============================================================================ 184 * Utilities 185 */ 186 void spec_yyerror( const char* str ) 187 { 188 int line = spec_yylineno; 189 if ( spec_yytext[0] == '\n' ) line --; 190 fprintf( stderr, "makelcf: line %d: %s\n", line, str ); 191 } 192 193 static char* getSection( void ) 194 { 195 char* p; 196 char* head = NULL; 197 198 for ( p = spec_yytext; *p; p ++ ) 199 { 200 switch ( *p ) 201 { 202 case '(': 203 while ( *p == ' ' ) p ++; 204 head = p + 1; 205 break; 206 207 case ')': 208 case ' ': 209 if ( head ) 210 { 211 *p = '\0'; 212 return strdup( head ); 213 } 214 break; 215 216 default: 217 break; 218 } 219 } 220 return strdup( "*" ); 221 } 222 223 static void YYText_ResolveDevVal( void ) 224 { 225 int i; 226 char* s = ResolveDefVal( spec_yytext ); 227 228 for ( i = strlen(s)-1; i >= 0; i -- ) 229 { 230 unput( s[i] ); 231 } 232 free(s); 233 return; 234 } 235 236 /*============================================================================ 237 * PARSE SPEC FILE 238 */ 239 int ParseSpecFile( const char* filename ) 240 { 241 FILE *fp; 242 int result; 243 244 if ( NULL == ( fp = fopen( filename, "r" ) ) ) 245 { 246 fprintf( stderr, "makelcf: cannot open %s\n", filename ); 247 return 2; 248 } 249 250 spec_yyin = fp; 251 result = spec_yyparse(); 252 fclose( fp ); 253 if ( result ) return 1; 254 255 return CheckSpec() ? 0 : 1; 256 } 257