1 /* |
|
2 Copyright 2012-2014 Santeri Piippo |
|
3 All rights reserved. |
|
4 |
|
5 Redistribution and use in source and binary forms, with or without |
|
6 modification, are permitted provided that the following conditions |
|
7 are met: |
|
8 |
|
9 1. Redistributions of source code must retain the above copyright |
|
10 notice, this list of conditions and the following disclaimer. |
|
11 2. Redistributions in binary form must reproduce the above copyright |
|
12 notice, this list of conditions and the following disclaimer in the |
|
13 documentation and/or other materials provided with the distribution. |
|
14 3. The name of the author may not be used to endorse or promote products |
|
15 derived from this software without specific prior written permission. |
|
16 |
|
17 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
|
18 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
19 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|
20 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
21 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
22 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
24 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
|
26 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
27 */ |
|
28 |
|
29 #ifndef BOTC_LEXER_H |
|
30 #define BOTC_LEXER_H |
|
31 |
|
32 #include "main.h" |
|
33 #include "lexer_scanner.h" |
|
34 |
|
35 class lexer |
|
36 { |
|
37 types: |
|
38 struct token |
|
39 { |
|
40 e_token type; |
|
41 string text; |
|
42 string file; |
|
43 int line; |
|
44 int column; |
|
45 }; |
|
46 |
|
47 using token_list = list<token>; |
|
48 using iterator = token_list::iterator; |
|
49 |
|
50 public: |
|
51 lexer(); |
|
52 ~lexer(); |
|
53 |
|
54 void process_file (string file_name); |
|
55 bool get_next (e_token req = tk_any); |
|
56 void must_get_next (e_token tok = tk_any); |
|
57 void must_get_any_of (const list<e_token>& toks); |
|
58 int get_one_symbol (const string_list& syms); |
|
59 void must_be (e_token tok); |
|
60 bool peek_next (token* tk = null); |
|
61 |
|
62 inline bool has_valid_token() const |
|
63 { |
|
64 return (m_token_position < m_tokens.end() && m_token_position >= m_tokens.begin()); |
|
65 } |
|
66 |
|
67 inline token* get_token() const |
|
68 { |
|
69 assert (has_valid_token() == true); |
|
70 return &(*m_token_position); |
|
71 } |
|
72 |
|
73 inline bool is_at_end() const |
|
74 { |
|
75 return m_token_position == m_tokens.end(); |
|
76 } |
|
77 |
|
78 inline e_token get_token_type() const |
|
79 { |
|
80 return get_token()->type; |
|
81 } |
|
82 |
|
83 // If @tok is given, describes the token. If not, describes @tok_type. |
|
84 static inline string describe_token_type (e_token tok_type) |
|
85 { |
|
86 return describe_token_private (tok_type, null); |
|
87 } |
|
88 |
|
89 static inline string describe_token (token* tok) |
|
90 { |
|
91 return describe_token_private (tok->type, tok); |
|
92 } |
|
93 |
|
94 static lexer* get_current_lexer(); |
|
95 |
|
96 inline void skip (int a = 1) |
|
97 { |
|
98 m_token_position += a; |
|
99 } |
|
100 |
|
101 string peek_next_string (int a = 1); |
|
102 |
|
103 private: |
|
104 token_list m_tokens; |
|
105 iterator m_token_position; |
|
106 |
|
107 // read a mandatory token from scanner |
|
108 void must_get_next_from_scanner (lexer_scanner& sc, e_token tt = tk_any); |
|
109 void check_file_header (lexer_scanner& sc); |
|
110 |
|
111 static string describe_token_private (e_token tok_type, token* tok); |
|
112 }; |
|
113 |
|
114 #endif // BOTC_LEXER_H |
|