1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/*===- ScriptScanner.ll ---------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===*/ 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* C/C++ Declarations */ 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/ScriptScanner.h> 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/ScriptFile.h> 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Support/MsgHandling.h> 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/ADT/StringRef.h> 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <string> 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef mcld::ScriptParser::token token; 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef mcld::ScriptParser::token_type token_type; 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define yyterminate() return token::END 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define YY_NO_UNISTD_H 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Flex Declarations and Options */ 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option c++ 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option batch 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option noyywrap 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option nounput 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option stack 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define YY_USER_ACTION yylloc->columns(yyleng); 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* abbrev. of RE @ref binutils ld/ldlex.l */ 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesFILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9] 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesNOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\~] 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWILDCHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\,\~\?\*\^\!] 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWS [ \t\r] 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Start conditions */ 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%s LDSCRIPT 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%s EXPRESSION 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%% /* Regular Expressions */ 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* code to place at the beginning of yylex() */ 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* reset location */ 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* determine the initial parser state */ 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_Kind == ScriptFile::Unknown) { 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Kind = pScriptFile.getKind(); 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pScriptFile.getKind()) { 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::LINKER_SCRIPT; 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Entry Point */ 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ENTRY" { return token::ENTRY; } 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* File Commands */ 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INCLUDE" { return token::INCLUDE; } 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INPUT" { return token::INPUT; } 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"GROUP" { return token::GROUP; } 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"AS_NEEDED" { return token::AS_NEEDED; } 78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT" { return token::OUTPUT; } 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SEARCH_DIR" { return token::SEARCH_DIR; } 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"STARTUP" { return token::STARTUP; } 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Format Commands */ 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT_FORMAT" { return token::OUTPUT_FORMAT; } 83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"TARGET" { return token::TARGET; } 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Misc Commands */ 85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ASSERT" { return token::ASSERT; } 86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"EXTERN" { return token::EXTERN; } 87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"FORCE_COMMON_ALLOCATION" { return token::FORCE_COMMON_ALLOCATION; } 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INHIBIT_COMMON_ALLOCATION" { return token::INHIBIT_COMMON_ALLOCATION; } 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INSERT" { return token::INSERT; } 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"NOCROSSREFS" { return token::NOCROSSREFS; } 91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT_ARCH" { return token::OUTPUT_ARCH; } 92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"LD_FEATURE" { return token::LD_FEATURE; } 93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Assignemnts */ 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"HIDDEN" { return token::HIDDEN; } 95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"PROVIDE" { return token::PROVIDE; } 96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"PROVIDE_HIDDEN" { return token::PROVIDE_HIDDEN; } 97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* SECTIONS Command */ 98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SECTIONS" { return token::SECTIONS; } 99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* MEMORY Command */ 100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"MEMORY" { return token::MEMORY; } 101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* PHDRS Command */ 102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"PHDRS" { return token::PHDRS; } 103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Builtin Functions */ 104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ABSOLUTE" { return token::ABSOLUTE; } 105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ADDR" { return token::ADDR; } 106f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"ALIGN" { return token::ALIGN; } 107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ALIGNOF" { return token::ALIGNOF; } 108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"BLOCK" { return token::BLOCK; } 109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_ALIGN" { return token::DATA_SEGMENT_ALIGN; } 110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_END" { return token::DATA_SEGMENT_END; } 111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_RELRO_END" { return token::DATA_SEGMENT_RELRO_END; } 112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DEFINED" { return token::DEFINED; } 113f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"LENGTH" { return token::LENGTH; } 114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"LOADADDR" { return token::LOADADDR; } 115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MAX" { return token::MAX; } 116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MIN" { return token::MIN; } 117f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"NEXT" { return token::NEXT; } 118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ORIGIN" { return token::ORIGIN; } 119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SEGMENT_START" { return token::SEGMENT_START; } 120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SIZEOF" { return token::SIZEOF; } 121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SIZEOF_HEADERS" { return token::SIZEOF_HEADERS; } 122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"CONSTANT" { return token::CONSTANT; } 123f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Symbolic Constants */ 124f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MAXPAGESIZE" { return token::MAXPAGESIZE; } 125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"COMMONPAGESIZE" { return token::COMMONPAGESIZE; } 126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Input Section Description */ 127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"EXCLUDE_FILE" { return token::EXCLUDE_FILE; } 128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"KEEP" { return token::KEEP; } 129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT" { return token::SORT_BY_NAME; } 130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_NAME" { return token::SORT_BY_NAME; } 131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_ALIGNMENT" { return token::SORT_BY_ALIGNMENT; } 132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_NONE" { return token::SORT_NONE; } 133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_INIT_PRIORITY" { return token::SORT_BY_INIT_PRIORITY; } 134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Data */ 135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"BYTE" { return token::BYTE; } 136f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SHORT" { return token::SHORT; } 137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"LONG" { return token::LONG; } 138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"QUAD" { return token::QUAD; } 139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SQUAD" { return token::SQUAD; } 140f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"FILL" { return token::FILL; } 141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Discarding */ 142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"DISCARD" { return token::DISCARD; } 143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Keywords */ 144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"CREATE_OBJECT_SYMBOLS" { return token::CREATE_OBJECT_SYMBOLS; } 145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"CONSTRUCTORS" { return token::CONSTRUCTORS; } 146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Attributes */ 147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Type */ 148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"NOLOAD" { return token::NOLOAD; } 149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"DSECT" { return token::DSECT; } 150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"COPY" { return token::COPY; } 151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"INFO" { return token::INFO; } 152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"OVERLAY" { return token::OVERLAY; } 153f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section LMA */ 154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"AT" { return token::AT; } 155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Forced Input Alignment */ 156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SUBALIGN" { return token::SUBALIGN; } 157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Constraint */ 158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ONLY_IF_RO" { return token::ONLY_IF_RO; } 159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ONLY_IF_RW" { return token::ONLY_IF_RW; } 160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Operators */ 161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<<" { return token::LSHIFT; } 162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">>" { return token::RSHIFT; } 163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"==" { return token::EQ; } 164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"!=" { return token::NE; } 165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<=" { return token::LE; } 166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">=" { return token::GE; } 167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&&" { return token::LOGICAL_AND; } 168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"||" { return token::LOGICAL_OR; } 169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"+=" { return token::ADD_ASSIGN; } 170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"-=" { return token::SUB_ASSIGN; } 171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"*=" { return token::MUL_ASSIGN; } 172f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/=" { return token::DIV_ASSIGN; } 173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&=" { return token::AND_ASSIGN; } 174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"|=" { return token::OR_ASSIGN; } 175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<<=" { return token::LS_ASSIGN; } 176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">>=" { return token::RS_ASSIGN; } 177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"," { return static_cast<token_type>(*yytext); } 178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"=" { return static_cast<token_type>(*yytext); } 179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"?" { return static_cast<token_type>(*yytext); } 180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>":" { return static_cast<token_type>(*yytext); } 181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"|" { return static_cast<token_type>(*yytext); } 182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"^" { return static_cast<token_type>(*yytext); } 183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&" { return static_cast<token_type>(*yytext); } 184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<" { return static_cast<token_type>(*yytext); } 185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">" { return static_cast<token_type>(*yytext); } 186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"+" { return static_cast<token_type>(*yytext); } 187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"-" { return static_cast<token_type>(*yytext); } 188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"*" { return static_cast<token_type>(*yytext); } 189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/" { return static_cast<token_type>(*yytext); } 190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"%" { return static_cast<token_type>(*yytext); } 191f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"!" { return static_cast<token_type>(*yytext); } 192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"~" { return static_cast<token_type>(*yytext); } 193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>";" { return static_cast<token_type>(*yytext); } 194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"(" { return static_cast<token_type>(*yytext); } 195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>")" { return static_cast<token_type>(*yytext); } 196f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"{" { return static_cast<token_type>(*yytext); } 197f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"}" { return static_cast<token_type>(*yytext); } 198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Numbers */ 200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { 201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::StringRef str(yytext, yyleng); 202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (str.back()) { 203f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'k': 204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'K': 205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->integer *= 1024; 207f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 208f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'm': 209f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'M': 210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->integer *= 1024 * 1024; 212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 214f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.getAsInteger(0, yylval->integer); 215f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 217f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::INTEGER; 218f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 219f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 220f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Expression string */ 221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>{FILENAMECHAR1}{SYMBOLCHARN}* { 222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 227f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* String */ 228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>{FILENAMECHAR1}{NOCFILENAMECHAR}* { 229f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 233f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>\"(\\.|[^\\"])*\" { 235f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /*" c string literal */ 236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 238f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 239f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 240f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 241f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* -l namespec */ 242f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"-l"{FILENAMECHAR1}{NOCFILENAMECHAR}* { 243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext + 2, yyleng - 2); 244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::LNAMESPEC; 246f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 248f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* WILDCHAR String */ 249f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>{WILDCHAR}* { 250f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (yytext[0] == '/' && yytext[1] == '*') { 251f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yyless (2); 252f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines enterComments(*yylloc); 253f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } else { 254f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 255f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 256f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 257f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 258f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 259f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 260f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up C comments */ 261f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/*" { 262f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines enterComments(*yylloc); 263f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 264f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 265f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 266f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up white-spaces */ 267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>{WS}+ { 268f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 269f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 271f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up end-of-lines */ 272f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>\n { 273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->lines(1); 274f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 277f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%% /* Additional Code */ 278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesnamespace mcld { 280f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 281f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptScanner::ScriptScanner(std::istream* yyin, std::ostream* yyout) 282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines : yyFlexLexer(yyin, yyout), m_Kind(ScriptFile::Unknown) 283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 284f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 285f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 286f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptScanner::~ScriptScanner() 287f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 288f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 289f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 290f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::enterComments(ScriptParser::location_type& pLocation) 291f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 292f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const int start_line = pLocation.begin.line; 293f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const int start_col = pLocation.begin.column; 294f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 295f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines int ch = 0; 296f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 297f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (true) { 298f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 299f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 300f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 301f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (ch != '*' && ch != EOF) { 302f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '\n') { 303f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.lines(1); 304f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 305f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 306f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 307f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 308f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 309f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 310f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '*') { 311f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 312f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 313f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 314f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (ch == '*') { 315f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 316f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 317f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 318f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 319f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '/') 320f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 321f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 322f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 323f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '\n') 324f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.lines(1); 325f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 326f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == EOF) { 327f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines error(diag::err_unterminated_comment) << pLocation.begin.filename 328f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines << start_line 329f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines << start_col; 330f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 331f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 332f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 333f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 334f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 335f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::setLexState(ScriptFile::Kind pKind) 336f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 337f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* push the state into the top of stach */ 338f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_StateStack.push(pKind); 339f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 340f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pKind) { 341f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 342f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(LDSCRIPT); 343f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 344f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 345f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(EXPRESSION); 346f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 347f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 348f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 349f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 350f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 351f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 352f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 353f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 354f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 355f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::popLexState() 356f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 357f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* pop the last state */ 358f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_StateStack.pop(); 359f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 360f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* resume the appropriate state */ 361f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (!m_StateStack.empty()) { 362f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (m_StateStack.top()) { 363f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 364f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(LDSCRIPT); 365f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 366f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 367f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(EXPRESSION); 368f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 369f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 370f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 371f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 372f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 373f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 374f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 375f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 376f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 377f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 378f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} /* namespace of mcld */ 379f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 380f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#ifdef yylex 381f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#undef yylex 382f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#endif 383f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 384f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesint yyFlexLexer::yylex() 385f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 386f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return 0; 387f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 388f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 389