ScriptScanner.ll revision 37b74a387bb3993387029859c2d9d051c41c724e
13bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath/*===- ScriptScanner.ll ---------------------------------------------------===// 23bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// 33bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// The MCLinker Project 43bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// 53bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// This file is distributed under the University of Illinois Open Source 63bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// License. See LICENSE.TXT for details. 73bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath// 83bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath//===----------------------------------------------------------------------===*/ 93bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 103bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%{ 113bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath/* C/C++ Declarations */ 123bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 133bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#include "mcld/Script/ScriptScanner.h" 143bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#include "mcld/Script/ScriptFile.h" 153bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#include "mcld/Support/MsgHandling.h" 163bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#include <llvm/ADT/StringRef.h> 173bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#include <string> 183bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 193bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamathtypedef mcld::ScriptParser::token token; 203bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamathtypedef mcld::ScriptParser::token_type token_type; 213bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 223bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#define yyterminate() return token::END 233bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#define YY_NO_UNISTD_H 243bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%} 253bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 263bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath/* Flex Declarations and Options */ 273bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%option c++ 283bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%option batch 293bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%option noyywrap 303bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%option nounput 313bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%option stack 323bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 333bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%{ 343bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath#define YY_USER_ACTION yylloc->columns(yyleng); 353bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%} 363bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 373bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath/* abbrev. of RE @ref binutils ld/ldlex.l */ 383bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan KamathFILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] 393bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan KamathSYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9] 403bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan KamathNOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\~] 413bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan KamathWILDCHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\,\~\?\*\^\!] 423bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan KamathWS [ \t\r] 433bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 443bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath/* Start conditions */ 453bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%s LDSCRIPT 463bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%s EXPRESSION 473bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 483bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%% /* Regular Expressions */ 493bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 503bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* code to place at the beginning of yylex() */ 513bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%{ 523bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* reset location */ 533bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath yylloc->step(); 543bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 553bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* determine the initial parser state */ 563bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath if (m_Kind == ScriptFile::Unknown) { 573bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath m_Kind = pScriptFile.getKind(); 583bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath switch (pScriptFile.getKind()) { 593bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath case ScriptFile::LDScript: 603bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath case ScriptFile::Expression: 613bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath return token::LINKER_SCRIPT; 623bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath case ScriptFile::VersionScript: 633bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath case ScriptFile::DynamicList: 643bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath default: 653bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath assert(0 && "Unsupported script type!"); 663bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath break; 673bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath } 683bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath } 693bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath%} 703bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath 713bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Entry Point */ 723bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"ENTRY" { return token::ENTRY; } 733bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* File Commands */ 743bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"INCLUDE" { return token::INCLUDE; } 753bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"INPUT" { return token::INPUT; } 763bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"GROUP" { return token::GROUP; } 773bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"AS_NEEDED" { return token::AS_NEEDED; } 783bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"OUTPUT" { return token::OUTPUT; } 793bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SEARCH_DIR" { return token::SEARCH_DIR; } 803bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"STARTUP" { return token::STARTUP; } 813bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Format Commands */ 823bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"OUTPUT_FORMAT" { return token::OUTPUT_FORMAT; } 833bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"TARGET" { return token::TARGET; } 843bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Misc Commands */ 853bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"ASSERT" { return token::ASSERT; } 863bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"EXTERN" { return token::EXTERN; } 873bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"FORCE_COMMON_ALLOCATION" { return token::FORCE_COMMON_ALLOCATION; } 883bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"INHIBIT_COMMON_ALLOCATION" { return token::INHIBIT_COMMON_ALLOCATION; } 893bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"INSERT" { return token::INSERT; } 903bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"NOCROSSREFS" { return token::NOCROSSREFS; } 913bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"OUTPUT_ARCH" { return token::OUTPUT_ARCH; } 923bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"LD_FEATURE" { return token::LD_FEATURE; } 933bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Assignemnts */ 943bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT,EXPRESSION>"HIDDEN" { return token::HIDDEN; } 953bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT,EXPRESSION>"PROVIDE" { return token::PROVIDE; } 963bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT,EXPRESSION>"PROVIDE_HIDDEN" { return token::PROVIDE_HIDDEN; } 973bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* SECTIONS Command */ 983bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SECTIONS" { return token::SECTIONS; } 993bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* MEMORY Command */ 1003bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"MEMORY" { return token::MEMORY; } 1013bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* PHDRS Command */ 1023bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"PHDRS" { return token::PHDRS; } 1033bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Builtin Functions */ 1043bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"ABSOLUTE" { return token::ABSOLUTE; } 1053bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"ADDR" { return token::ADDR; } 1063bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT,EXPRESSION>"ALIGN" { return token::ALIGN; } 1073bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"ALIGNOF" { return token::ALIGNOF; } 1083bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"BLOCK" { return token::BLOCK; } 1093bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"DATA_SEGMENT_ALIGN" { return token::DATA_SEGMENT_ALIGN; } 1103bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"DATA_SEGMENT_END" { return token::DATA_SEGMENT_END; } 1113bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"DATA_SEGMENT_RELRO_END" { return token::DATA_SEGMENT_RELRO_END; } 1123bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"DEFINED" { return token::DEFINED; } 1133bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"LENGTH" { return token::LENGTH; } 1143bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"LOADADDR" { return token::LOADADDR; } 1153bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"MAX" { return token::MAX; } 1163bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"MIN" { return token::MIN; } 1173bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"NEXT" { return token::NEXT; } 1183bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"ORIGIN" { return token::ORIGIN; } 1193bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"SEGMENT_START" { return token::SEGMENT_START; } 1203bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"SIZEOF" { return token::SIZEOF; } 1213bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"SIZEOF_HEADERS" { return token::SIZEOF_HEADERS; } 1223bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"CONSTANT" { return token::CONSTANT; } 1233bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Symbolic Constants */ 1243bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"MAXPAGESIZE" { return token::MAXPAGESIZE; } 1253bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<EXPRESSION>"COMMONPAGESIZE" { return token::COMMONPAGESIZE; } 1263bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Input Section Description */ 1273bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"EXCLUDE_FILE" { return token::EXCLUDE_FILE; } 1283bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"KEEP" { return token::KEEP; } 1293bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SORT" { return token::SORT_BY_NAME; } 1303bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SORT_BY_NAME" { return token::SORT_BY_NAME; } 1313bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SORT_BY_ALIGNMENT" { return token::SORT_BY_ALIGNMENT; } 1323bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SORT_NONE" { return token::SORT_NONE; } 1333bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SORT_BY_INIT_PRIORITY" { return token::SORT_BY_INIT_PRIORITY; } 1343bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath /* Output Section Data */ 1353bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"BYTE" { return token::BYTE; } 1363bdd327f8532a79b83f575cc62e8eb09a1f93f3dNarayan Kamath<LDSCRIPT>"SHORT" { return token::SHORT; } 137<LDSCRIPT>"LONG" { return token::LONG; } 138<LDSCRIPT>"QUAD" { return token::QUAD; } 139<LDSCRIPT>"SQUAD" { return token::SQUAD; } 140<LDSCRIPT>"FILL" { return token::FILL; } 141 /* Output Section Discarding */ 142<LDSCRIPT>"DISCARD" { return token::DISCARD; } 143 /* Output Section Keywords */ 144<LDSCRIPT>"CREATE_OBJECT_SYMBOLS" { return token::CREATE_OBJECT_SYMBOLS; } 145<LDSCRIPT>"CONSTRUCTORS" { return token::CONSTRUCTORS; } 146 /* Output Section Attributes */ 147 /* Output Section Type */ 148<LDSCRIPT,EXPRESSION>"NOLOAD" { return token::NOLOAD; } 149<LDSCRIPT,EXPRESSION>"DSECT" { return token::DSECT; } 150<LDSCRIPT,EXPRESSION>"COPY" { return token::COPY; } 151<LDSCRIPT,EXPRESSION>"INFO" { return token::INFO; } 152<LDSCRIPT,EXPRESSION>"OVERLAY" { return token::OVERLAY; } 153 /* Output Section LMA */ 154<LDSCRIPT>"AT" { return token::AT; } 155 /* Forced Input Alignment */ 156<LDSCRIPT>"SUBALIGN" { return token::SUBALIGN; } 157 /* Output Section Constraint */ 158<LDSCRIPT>"ONLY_IF_RO" { return token::ONLY_IF_RO; } 159<LDSCRIPT>"ONLY_IF_RW" { return token::ONLY_IF_RW; } 160 /* Operators */ 161<LDSCRIPT,EXPRESSION>"<<" { return token::LSHIFT; } 162<LDSCRIPT,EXPRESSION>">>" { return token::RSHIFT; } 163<LDSCRIPT,EXPRESSION>"==" { return token::EQ; } 164<LDSCRIPT,EXPRESSION>"!=" { return token::NE; } 165<LDSCRIPT,EXPRESSION>"<=" { return token::LE; } 166<LDSCRIPT,EXPRESSION>">=" { return token::GE; } 167<LDSCRIPT,EXPRESSION>"&&" { return token::LOGICAL_AND; } 168<LDSCRIPT,EXPRESSION>"||" { return token::LOGICAL_OR; } 169<LDSCRIPT,EXPRESSION>"+=" { return token::ADD_ASSIGN; } 170<LDSCRIPT,EXPRESSION>"-=" { return token::SUB_ASSIGN; } 171<LDSCRIPT,EXPRESSION>"*=" { return token::MUL_ASSIGN; } 172<LDSCRIPT,EXPRESSION>"/=" { return token::DIV_ASSIGN; } 173<LDSCRIPT,EXPRESSION>"&=" { return token::AND_ASSIGN; } 174<LDSCRIPT,EXPRESSION>"|=" { return token::OR_ASSIGN; } 175<LDSCRIPT,EXPRESSION>"<<=" { return token::LS_ASSIGN; } 176<LDSCRIPT,EXPRESSION>">>=" { return token::RS_ASSIGN; } 177<LDSCRIPT,EXPRESSION>"," { return static_cast<token_type>(*yytext); } 178<LDSCRIPT,EXPRESSION>"=" { return static_cast<token_type>(*yytext); } 179<LDSCRIPT,EXPRESSION>"?" { return static_cast<token_type>(*yytext); } 180<LDSCRIPT,EXPRESSION>":" { return static_cast<token_type>(*yytext); } 181<LDSCRIPT,EXPRESSION>"|" { return static_cast<token_type>(*yytext); } 182<LDSCRIPT,EXPRESSION>"^" { return static_cast<token_type>(*yytext); } 183<LDSCRIPT,EXPRESSION>"&" { return static_cast<token_type>(*yytext); } 184<LDSCRIPT,EXPRESSION>"<" { return static_cast<token_type>(*yytext); } 185<LDSCRIPT,EXPRESSION>">" { return static_cast<token_type>(*yytext); } 186<LDSCRIPT,EXPRESSION>"+" { return static_cast<token_type>(*yytext); } 187<LDSCRIPT,EXPRESSION>"-" { return static_cast<token_type>(*yytext); } 188<LDSCRIPT,EXPRESSION>"*" { return static_cast<token_type>(*yytext); } 189<LDSCRIPT,EXPRESSION>"/" { return static_cast<token_type>(*yytext); } 190<LDSCRIPT,EXPRESSION>"%" { return static_cast<token_type>(*yytext); } 191<LDSCRIPT,EXPRESSION>"!" { return static_cast<token_type>(*yytext); } 192<LDSCRIPT,EXPRESSION>"~" { return static_cast<token_type>(*yytext); } 193<LDSCRIPT,EXPRESSION>";" { return static_cast<token_type>(*yytext); } 194<LDSCRIPT,EXPRESSION>"(" { return static_cast<token_type>(*yytext); } 195<LDSCRIPT,EXPRESSION>")" { return static_cast<token_type>(*yytext); } 196<LDSCRIPT,EXPRESSION>"{" { return static_cast<token_type>(*yytext); } 197<LDSCRIPT,EXPRESSION>"}" { return static_cast<token_type>(*yytext); } 198 199 /* Numbers */ 200<LDSCRIPT,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { 201 llvm::StringRef str(yytext, yyleng); 202 switch (str.back()) { 203 case 'k': 204 case 'K': 205 str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 206 yylval->integer *= 1024; 207 break; 208 case 'm': 209 case 'M': 210 str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 211 yylval->integer *= 1024 * 1024; 212 break; 213 default: 214 str.getAsInteger(0, yylval->integer); 215 break; 216 } 217 return token::INTEGER; 218} 219 220 /* Expression string */ 221<EXPRESSION>{FILENAMECHAR1}{SYMBOLCHARN}* { 222 const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 223 yylval->string = &str; 224 return token::STRING; 225} 226 227 /* String */ 228<LDSCRIPT>{FILENAMECHAR1}{NOCFILENAMECHAR}* { 229 const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 230 yylval->string = &str; 231 return token::STRING; 232} 233 234<LDSCRIPT,EXPRESSION>\"(\\.|[^\\"])*\" { 235 /*" c string literal */ 236 const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 237 yylval->string = &str; 238 return token::STRING; 239} 240 241 /* -l namespec */ 242<LDSCRIPT>"-l"{FILENAMECHAR1}{NOCFILENAMECHAR}* { 243 const std::string& str = pScriptFile.createParserStr(yytext + 2, yyleng - 2); 244 yylval->string = &str; 245 return token::LNAMESPEC; 246} 247 248 /* WILDCHAR String */ 249<LDSCRIPT>{WILDCHAR}* { 250 if (yytext[0] == '/' && yytext[1] == '*') { 251 yyless (2); 252 enterComments(*yylloc); 253 } else { 254 const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 255 yylval->string = &str; 256 return token::STRING; 257 } 258} 259 260 /* gobble up C comments */ 261<LDSCRIPT,EXPRESSION>"/*" { 262 enterComments(*yylloc); 263 yylloc->step(); 264} 265 266 /* gobble up white-spaces */ 267<LDSCRIPT,EXPRESSION>{WS}+ { 268 yylloc->step(); 269} 270 271 /* gobble up end-of-lines */ 272<LDSCRIPT,EXPRESSION>\n { 273 yylloc->lines(1); 274 yylloc->step(); 275} 276 277%% /* Additional Code */ 278 279namespace mcld { 280 281ScriptScanner::ScriptScanner(std::istream* yyin, std::ostream* yyout) 282 : yyFlexLexer(yyin, yyout), m_Kind(ScriptFile::Unknown) 283{ 284} 285 286ScriptScanner::~ScriptScanner() 287{ 288} 289 290void ScriptScanner::enterComments(ScriptParser::location_type& pLocation) 291{ 292 const int start_line = pLocation.begin.line; 293 const int start_col = pLocation.begin.column; 294 295 int ch = 0; 296 297 while (true) { 298 ch = yyinput(); 299 pLocation.columns(1); 300 301 while (ch != '*' && ch != EOF) { 302 if (ch == '\n') { 303 pLocation.lines(1); 304 } 305 306 ch = yyinput(); 307 pLocation.columns(1); 308 } 309 310 if (ch == '*') { 311 ch = yyinput(); 312 pLocation.columns(1); 313 314 while (ch == '*') { 315 ch = yyinput(); 316 pLocation.columns(1); 317 } 318 319 if (ch == '/') 320 break; 321 } 322 323 if (ch == '\n') 324 pLocation.lines(1); 325 326 if (ch == EOF) { 327 error(diag::err_unterminated_comment) << pLocation.begin.filename 328 << start_line 329 << start_col; 330 break; 331 } 332 } 333} 334 335void ScriptScanner::setLexState(ScriptFile::Kind pKind) 336{ 337 /* push the state into the top of stach */ 338 m_StateStack.push(pKind); 339 340 switch (pKind) { 341 case ScriptFile::LDScript: 342 BEGIN(LDSCRIPT); 343 break; 344 case ScriptFile::Expression: 345 BEGIN(EXPRESSION); 346 break; 347 case ScriptFile::VersionScript: 348 case ScriptFile::DynamicList: 349 default: 350 assert(0 && "Unsupported script type!"); 351 break; 352 } 353} 354 355void ScriptScanner::popLexState() 356{ 357 /* pop the last state */ 358 m_StateStack.pop(); 359 360 /* resume the appropriate state */ 361 if (!m_StateStack.empty()) { 362 switch (m_StateStack.top()) { 363 case ScriptFile::LDScript: 364 BEGIN(LDSCRIPT); 365 break; 366 case ScriptFile::Expression: 367 BEGIN(EXPRESSION); 368 break; 369 case ScriptFile::VersionScript: 370 case ScriptFile::DynamicList: 371 default: 372 assert(0 && "Unsupported script type!"); 373 break; 374 } 375 } 376} 377 378} /* namespace mcld */ 379 380#ifdef yylex 381#undef yylex 382#endif 383 384int yyFlexLexer::yylex() 385{ 386 return 0; 387} 388 389