1//===- ScriptScanner.h ----------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_SCRIPT_SCRIPTSCANNER_H_
10#define MCLD_SCRIPT_SCRIPTSCANNER_H_
11
12#ifndef __FLEX_LEXER_H
13#include "FlexLexer.h"
14#endif
15
16#ifndef YY_DECL
17#define YY_DECL                                            \
18  mcld::ScriptParser::token_type mcld::ScriptScanner::lex( \
19      mcld::ScriptParser::semantic_type* yylval,           \
20      mcld::ScriptParser::location_type* yylloc,           \
21      const mcld::ScriptFile& pScriptFile)
22#endif
23
24#include "mcld/Script/ScriptFile.h"
25#include "ScriptParser.h"
26#include <stack>
27
28namespace mcld {
29
30/** \class ScriptScanner
31 *
32 */
33class ScriptScanner : public yyFlexLexer {
34 public:
35  explicit ScriptScanner(std::istream* yyin = NULL, std::ostream* yyout = NULL);
36
37  virtual ~ScriptScanner();
38
39  virtual ScriptParser::token_type lex(ScriptParser::semantic_type* yylval,
40                                       ScriptParser::location_type* yylloc,
41                                       const ScriptFile& pScriptFile);
42
43  void setLexState(ScriptFile::Kind pKind);
44
45  void popLexState();
46
47 private:
48  void enterComments(ScriptParser::location_type& pLocation);
49
50 private:
51  ScriptFile::Kind m_Kind;
52  std::stack<ScriptFile::Kind> m_StateStack;
53};
54
55}  // namespace mcld
56
57#endif  // MCLD_SCRIPT_SCRIPTSCANNER_H_
58