Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
scanner.h
Go to the documentation of this file.
1
29#ifndef RWSTD_UTIL_SCANNER_H_INCLUDED
30#define RWSTD_UTIL_SCANNER_H_INCLUDED
31
32#include <string>
33#include <stack>
34#include <climits> // for ULONG_MAX
35
36
37struct ScannerContext;
38
39
41{
42public:
43
44 // enumeration of all tokens in the character map
45 // and locale definition file
46 enum token_id {
47 tok_code_set_name, // <code_set_name>
48 tok_mb_cur_max, // <mb_cur_max>
49 tok_mb_cur_min, // <mb_cur_min>
50 // sections
51 tok_charmap, // beginning of CHARMAP section
52 tok_collate, // beginning of LC_COLLATE section
53 tok_ctype, // beginning of LC_CTYPE section
54 tok_messages, // beginning of LC_MESSAGES section
55 tok_monetary, // beginning of LC_MONETARY section
56 tok_numeric, // beginning of LC_NUMERIC section
57 tok_time, // beginning of LC_TIME section
58 // ISO/IEC TR 14652 extensions:
59 tok_addr, // beginning of LC_ADDRESS section
60 tok_ident, // beginning of LC_IDENTIFICATION section
61 tok_measure, // beginning of LC_MEASUREMENT section
62 tok_name, // beginning of LC_NAME section
63 tok_paper, // beginning of LC_PAPER section
64 tok_phone, // beginning of LC_TELEPHONE section
65 //
66 tok_end, // END of a section
67 // LC_CTYPE-specific tokens
68 tok_upper, // upper section of LC_CTYPE
69 tok_lower, // lower section of LC_CTYPE
70 tok_digit, // digit section of LC_CTYPE
71 tok_space, // space section of LC_CTYPE
72 tok_alpha, // alpha section of LC_CTYPE
73 tok_graph, // graph section of LC_CTYPE
74 tok_print, // print section of LC_CTYPE
75 tok_cntrl, // cntrl section of LC_CTYPE
76 tok_punct, // punct section of LC_CTYPE
77 tok_xdigit, // xdigit section of LC_CTYPE
78 tok_blank, // blank section of LC_CTYPE
79 tok_tolower, // tolower section of LC_CTYPE
80 tok_toupper, // toupper section of LC_CTYPE
81 // LC_COLLATE-specific tokens
83 tok_coll_elem, // collating-element
84 tok_coll_sym, // collating symbol
86 tok_xlit_start, // translit_start
87 tok_xlit_end, // translit_end
98 //
101 // absolute, hexadecimal, decimal, and double-increment
102 // ellipses (see ISO/IEC TR 14652)
106 tok_dbl_ellipsis, // "..(N).."
108 // LC_MONETARY-specific tokens
130 // LC_NUMERIC-specific tokens
131 tok_decimal_point, // decimal point
132 tok_thousands_sep, // thousands_sep
133 tok_grouping, // grouping
134 tok_truename, // truename (C++ extension)
135 tok_falsename, // falsename (C++ extension)
136 // LC_TIME-specific tokens
151 // LC_MESSAGES-specific tokens
154 // LC_ADDRESS-specific tokens
155 // LC_IDENTIFICATION-specific tokens
156 // LC_MEASUREMENT-specific tokens
157 // LC_NAME-specific tokens
158 // LC_PAPER-specific tokens
159 // LC_TELEPHONE-specific tokens
160 // other:
161 tok_sym_name, // symbolic character name
162 tok_char_value, // character value (octal, decimal, or hex)
163 tok_comment, // comment
164 tok_comment_char, // <comment_char>
165 tok_escape_char, // <escape_char>
166 tok_copy, // copy directive
167 tok_include, // include directive
168 tok_nl, // newline
169 tok_ndef, // unknown/undefined token
170 tok_end_tokens // end of input
171 };
172
173 // scanner states
174 // enum {valid, invalid};
175
176 // a structure that represents a token
177 struct token_t {
178 std::string name;
180
181 // file position
182 int line;
184
185 // file name pointer
186 const char* file;
187 };
188
189 // realization
190 Scanner ();
191 virtual ~Scanner();
192
193 // public interface
195
196 void open (std::string, char = '#', char = '\\');
197
198 void close ();
199
200 char escape_char () const;
201
202 void ignore_line ();
203
204 // converts an octal, decimal, or hexadecimal escape sequence
205 // (or a multibyte sequence of such things) to a numeric value
206 unsigned long
207 convert_escape (const char*, const char** = 0, bool = false) const;
208
209private:
210
211 Scanner (const Scanner&); // not defined
212 void operator= (const Scanner&); // not defined
213
214 // helper function that identifies a token from a string and
215 // returns a new token_t object
216 token_id process_token (const char* name);
217
218 // read a line from stream
219 void read_line ();
220
221 // current file context and stack of context objects
222 ScannerContext* context_;
223 std::stack<ScannerContext*> context_stack_;
224
225 unsigned nlines_; // number of lines read
226 unsigned ntokens_; // number of tokens read
227
228 // was the last token an escaped newline
229 bool escaped_newline_;
230};
231
232
233#endif // RWSTD_UTIL_SCANNER_H_INCLUDED
#define open(f, m)
virtual ~Scanner()
Definition scanner.cpp:116
char escape_char() const
Definition scanner.cpp:129
void close()
Definition scanner.cpp:169
void ignore_line()
Definition scanner.cpp:135
unsigned long convert_escape(const char *, const char **=0, bool=false) const
Definition scanner.cpp:705
token_t next_token()
Definition scanner.cpp:352
@ tok_punct
Definition scanner.h:76
@ tok_addr
Definition scanner.h:59
@ tok_cntrl
Definition scanner.h:75
@ tok_mon_thousands_sep
Definition scanner.h:112
@ tok_backward
Definition scanner.h:95
@ tok_int_n_sign_posn
Definition scanner.h:129
@ tok_int_frac_digits
Definition scanner.h:116
@ tok_d_t_fmt
Definition scanner.h:141
@ tok_tolower
Definition scanner.h:79
@ tok_thousands_sep
Definition scanner.h:132
@ tok_end
Definition scanner.h:66
@ tok_decimal_point
Definition scanner.h:131
@ tok_upper
Definition scanner.h:68
@ tok_numeric
Definition scanner.h:56
@ tok_int_p_sep_by_space
Definition scanner.h:126
@ tok_abday
Definition scanner.h:137
@ tok_script
Definition scanner.h:82
@ tok_int_n_sep_by_space
Definition scanner.h:127
@ tok_era_t_fmt
Definition scanner.h:148
@ tok_n_sep_by_space
Definition scanner.h:121
@ tok_n_cs_precedes
Definition scanner.h:120
@ tok_reorder_section_end
Definition scanner.h:91
@ tok_comment_char
Definition scanner.h:164
@ tok_am_pm
Definition scanner.h:144
@ tok_p_sep_by_space
Definition scanner.h:119
@ tok_sym_name
Definition scanner.h:161
@ tok_era
Definition scanner.h:146
@ tok_blank
Definition scanner.h:78
@ tok_escape_char
Definition scanner.h:165
@ tok_lower
Definition scanner.h:69
@ tok_negative_sign
Definition scanner.h:115
@ tok_mon
Definition scanner.h:140
@ tok_reorder_end
Definition scanner.h:89
@ tok_paper
Definition scanner.h:63
@ tok_int_n_cs_precedes
Definition scanner.h:125
@ tok_xdigit
Definition scanner.h:77
@ tok_include
Definition scanner.h:167
@ tok_t_fmt
Definition scanner.h:143
@ tok_comment
Definition scanner.h:163
@ tok_string
Definition scanner.h:99
@ tok_era_d_fmt
Definition scanner.h:147
@ tok_ignore
Definition scanner.h:100
@ tok_xlit_start
Definition scanner.h:86
@ tok_messages
Definition scanner.h:54
@ tok_space
Definition scanner.h:71
@ tok_mb_cur_min
Definition scanner.h:49
@ tok_frac_digits
Definition scanner.h:117
@ tok_code_set_name
Definition scanner.h:47
@ tok_coll_sym
Definition scanner.h:84
@ tok_alt_digits
Definition scanner.h:150
@ tok_truename
Definition scanner.h:134
@ tok_p_sign_posn
Definition scanner.h:122
@ tok_forward
Definition scanner.h:94
@ tok_yesexpr
Definition scanner.h:152
@ tok_ndef
Definition scanner.h:169
@ tok_positive_sign
Definition scanner.h:114
@ tok_day
Definition scanner.h:138
@ tok_mon_grouping
Definition scanner.h:113
@ tok_undefined
Definition scanner.h:97
@ tok_grouping
Definition scanner.h:133
@ tok_phone
Definition scanner.h:64
@ tok_collate
Definition scanner.h:52
@ tok_print
Definition scanner.h:74
@ tok_monetary
Definition scanner.h:55
@ tok_digit
Definition scanner.h:70
@ tok_coll_elem
Definition scanner.h:83
@ tok_mb_cur_max
Definition scanner.h:48
@ tok_abmon
Definition scanner.h:139
@ tok_reorder
Definition scanner.h:88
@ tok_order_start
Definition scanner.h:92
@ tok_ctype
Definition scanner.h:53
@ tok_currency_symbol
Definition scanner.h:110
@ tok_copy
Definition scanner.h:166
@ tok_int_curr_symbol
Definition scanner.h:109
@ tok_time
Definition scanner.h:57
@ tok_abs_ellipsis
Definition scanner.h:103
@ tok_nl
Definition scanner.h:168
@ tok_measure
Definition scanner.h:61
@ tok_falsename
Definition scanner.h:135
@ tok_position
Definition scanner.h:96
@ tok_reorder_section
Definition scanner.h:90
@ tok_char_value
Definition scanner.h:162
@ tok_toupper
Definition scanner.h:80
@ tok_from
Definition scanner.h:85
@ tok_alpha
Definition scanner.h:72
@ tok_xlit_end
Definition scanner.h:87
@ tok_n_sign_posn
Definition scanner.h:123
@ tok_era_d_t_fmt
Definition scanner.h:149
@ tok_order_end
Definition scanner.h:93
@ tok_name
Definition scanner.h:62
@ tok_int_p_sign_posn
Definition scanner.h:128
@ tok_ident
Definition scanner.h:60
@ tok_end_tokens
Definition scanner.h:170
@ tok_charmap
Definition scanner.h:51
@ tok_noexpr
Definition scanner.h:153
@ tok_mon_decimal_point
Definition scanner.h:111
@ tok_t_fmt_ampm
Definition scanner.h:145
@ tok_dec_ellipsis
Definition scanner.h:105
@ tok_graph
Definition scanner.h:73
@ tok_width
Definition scanner.h:107
@ tok_p_cs_precedes
Definition scanner.h:118
@ tok_d_fmt
Definition scanner.h:142
@ tok_dbl_ellipsis
Definition scanner.h:106
@ tok_hex_ellipsis
Definition scanner.h:104
@ tok_int_p_cs_precedes
Definition scanner.h:124
const char * name
Definition codecvt1.cpp:72
std::string name
Definition scanner.h:178
token_id token
Definition scanner.h:179
const char * file
Definition scanner.h:186