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