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