#include <preprocessor.hh>
Inheritance diagram for lestes::lang::cplus::lex::preprocessor:

Public Member Functions | |
| bool | pragma_flag_get (void) const |
| Returns the pragma flag. | |
| ptr< cpp_token > | read (void) |
| Reads next token. | |
Static Public Member Functions | |
| static ptr< preprocessor > | create (const ptr< file_system > &a_fs, const lstring &file_name) |
| Returns new instance. | |
Protected Member Functions | |
| preprocessor (const ptr< file_system > &a_fs, const lstring &file_name) | |
| Creates the object. | |
| virtual void | gc_mark (void) |
| Marks the object. | |
Private Member Functions | |
| ptr< lex_literal > | classify_number (const ptr< source_location > &loc, const ptr< token_value > &tv) |
| Classifies number. | |
| preprocessor (const preprocessor &) | |
| Hides copy constructor. | |
| preprocessor & | operator= (const preprocessor &) |
| Hides assignment operator. | |
Private Attributes | |
| ulint | order |
| The order of tokens in translation unit. | |
| srp< file_system > | fs |
| File system binding. | |
| srp< evaluator > | eva |
| Evaluator. | |
| srp< space_remover > | spr |
| Whitespace remover. | |
| srp< string_translator > | str |
| String translator. | |
| srp< string_joiner > | stj |
| String joiner. | |
Definition at line 68 of file preprocessor.hh.
| lestes::lang::cplus::lex::preprocessor::preprocessor | ( | const ptr< file_system > & | a_fs, | |
| const lstring & | file_name | |||
| ) | [protected] |
Creates the object.
Creates new preprocessor.
| a_fs | The file system binding. | |
| file_name | The full name of the file to process. |
Definition at line 61 of file preprocessor.cc.
Referenced by create().
00061 : 00062 order(1), 00063 fs(checked(a_fs)), 00064 eva(evaluator::create(a_fs,file_name)), 00065 spr(space_remover::create(eva)), 00066 str(string_translator::create(spr)), 00067 stj(string_joiner::create(str)) 00068 { 00069 }
| lestes::lang::cplus::lex::preprocessor::preprocessor | ( | const preprocessor & | ) | [private] |
Hides copy constructor.
| bool lestes::lang::cplus::lex::preprocessor::pragma_flag_get | ( | void | ) | const |
Returns the pragma flag.
Returns pragma flag.
Definition at line 75 of file preprocessor.cc.
References eva.
00076 { 00077 return eva->pragma_flag_get(); 00078 }
| ptr< cpp_token > lestes::lang::cplus::lex::preprocessor::read | ( | void | ) |
Reads next token.
Reads next token from the translation unit. Converts pp_token to cpp_token, reports error if not possible. Extracts additional information for literals.
Definition at line 86 of file preprocessor.cc.
References classify_number(), lestes::lang::cplus::lex::lex_boolean_literal::create(), lestes::lang::cplus::lex::token_value::create(), lestes::lang::cplus::lex::lex_integral_literal::create(), lestes::lang::cplus::lex::lex_character_literal::create(), lestes::lang::cplus::lex::lex_string_literal::create(), lestes::lang::cplus::lex::cpp_token::create(), lestes::lang::cplus::lex::cpp_token::create_literal(), lestes::msg::eolog, lestes::lang::cplus::lex::invalid_cpp_token, lassert2, lestes::lang::cplus::lex::lex_integral_literal::NONE, lestes::lang::cplus::lex::lex_integral_literal::OCTAL, order, lestes::report, stj, lestes::lang::cplus::lex::stray_character, TOK_AMP, lestes::lang::cplus::lex::pp_token::TOK_AMP, TOK_AMP_AMP, lestes::lang::cplus::lex::pp_token::TOK_AMP_AMP, TOK_AMP_EQ, lestes::lang::cplus::lex::pp_token::TOK_AMP_EQ, TOK_ASM, lestes::lang::cplus::lex::pp_token::TOK_ASM, TOK_AUTO, lestes::lang::cplus::lex::pp_token::TOK_AUTO, TOK_BOOL, lestes::lang::cplus::lex::pp_token::TOK_BOOL, lestes::lang::cplus::lex::pp_token::TOK_BOOL_LIT, TOK_BREAK, lestes::lang::cplus::lex::pp_token::TOK_BREAK, TOK_CASE, lestes::lang::cplus::lex::pp_token::TOK_CASE, TOK_CATCH, lestes::lang::cplus::lex::pp_token::TOK_CATCH, TOK_CHAR, lestes::lang::cplus::lex::pp_token::TOK_CHAR, lestes::lang::cplus::lex::pp_token::TOK_CHAR_LIT, TOK_CLASS, lestes::lang::cplus::lex::pp_token::TOK_CLASS, TOK_COLON, lestes::lang::cplus::lex::pp_token::TOK_COLON, TOK_COLON_COLON, lestes::lang::cplus::lex::pp_token::TOK_COLON_COLON, TOK_COMMA, lestes::lang::cplus::lex::pp_token::TOK_COMMA, TOK_CONST, lestes::lang::cplus::lex::pp_token::TOK_CONST, TOK_CONST_CAST, lestes::lang::cplus::lex::pp_token::TOK_CONST_CAST, TOK_CONTINUE, lestes::lang::cplus::lex::pp_token::TOK_CONTINUE, TOK_DEFAULT, lestes::lang::cplus::lex::pp_token::TOK_DEFAULT, TOK_DELETE, lestes::lang::cplus::lex::pp_token::TOK_DELETE, TOK_DO, lestes::lang::cplus::lex::pp_token::TOK_DO, TOK_DOT, lestes::lang::cplus::lex::pp_token::TOK_DOT, TOK_DOT_DOT_DOT, lestes::lang::cplus::lex::pp_token::TOK_DOT_DOT_DOT, TOK_DOT_STAR, lestes::lang::cplus::lex::pp_token::TOK_DOT_STAR, TOK_DOUBLE, lestes::lang::cplus::lex::pp_token::TOK_DOUBLE, TOK_DYNAMIC_CAST, lestes::lang::cplus::lex::pp_token::TOK_DYNAMIC_CAST, TOK_ELSE, lestes::lang::cplus::lex::pp_token::TOK_ELSE, lestes::lang::cplus::lex::pp_token::TOK_EMARK, lestes::lang::cplus::lex::pp_token::TOK_EMARK_EQ, TOK_ENUM, lestes::lang::cplus::lex::pp_token::TOK_ENUM, TOK_EOF, TOK_EQ, lestes::lang::cplus::lex::pp_token::TOK_EQ, TOK_EQ_EQ, lestes::lang::cplus::lex::pp_token::TOK_EQ_EQ, TOK_EXCLAMATION, TOK_EXCLAMATION_EQ, TOK_EXPLICIT, lestes::lang::cplus::lex::pp_token::TOK_EXPLICIT, TOK_EXPORT, lestes::lang::cplus::lex::pp_token::TOK_EXPORT, TOK_EXTERN, lestes::lang::cplus::lex::pp_token::TOK_EXTERN, lestes::lang::cplus::lex::pp_token::TOK_FILE_END, TOK_FLOAT, lestes::lang::cplus::lex::pp_token::TOK_FLOAT, TOK_FOR, lestes::lang::cplus::lex::pp_token::TOK_FOR, TOK_FRIEND, lestes::lang::cplus::lex::pp_token::TOK_FRIEND, TOK_GOTO, lestes::lang::cplus::lex::pp_token::TOK_GOTO, TOK_GT, lestes::lang::cplus::lex::pp_token::TOK_GT, TOK_GT_EQ, lestes::lang::cplus::lex::pp_token::TOK_GT_EQ, TOK_GT_GT, lestes::lang::cplus::lex::pp_token::TOK_GT_GT, TOK_GT_GT_EQ, lestes::lang::cplus::lex::pp_token::TOK_GT_GT_EQ, lestes::lang::cplus::lex::pp_token::TOK_HASH, lestes::lang::cplus::lex::pp_token::TOK_HASH_HASH, TOK_HAT, lestes::lang::cplus::lex::pp_token::TOK_HAT, TOK_HAT_EQ, lestes::lang::cplus::lex::pp_token::TOK_HAT_EQ, TOK_IDENT, lestes::lang::cplus::lex::pp_token::TOK_IDENT, TOK_IF, lestes::lang::cplus::lex::pp_token::TOK_IF, TOK_INLINE, lestes::lang::cplus::lex::pp_token::TOK_INLINE, TOK_INT, lestes::lang::cplus::lex::pp_token::TOK_INT, TOK_LEFT_BRACE, lestes::lang::cplus::lex::pp_token::TOK_LEFT_BRACE, TOK_LEFT_BRACKET, lestes::lang::cplus::lex::pp_token::TOK_LEFT_BRACKET, TOK_LEFT_PAR, lestes::lang::cplus::lex::pp_token::TOK_LEFT_PAR, TOK_LONG, lestes::lang::cplus::lex::pp_token::TOK_LONG, TOK_LT, lestes::lang::cplus::lex::pp_token::TOK_LT, TOK_LT_EQ, lestes::lang::cplus::lex::pp_token::TOK_LT_EQ, TOK_LT_LT, lestes::lang::cplus::lex::pp_token::TOK_LT_LT, TOK_LT_LT_EQ, lestes::lang::cplus::lex::pp_token::TOK_LT_LT_EQ, TOK_MINUS, lestes::lang::cplus::lex::pp_token::TOK_MINUS, TOK_MINUS_EQ, lestes::lang::cplus::lex::pp_token::TOK_MINUS_EQ, TOK_MINUS_GT, lestes::lang::cplus::lex::pp_token::TOK_MINUS_GT, TOK_MINUS_GT_STAR, lestes::lang::cplus::lex::pp_token::TOK_MINUS_GT_STAR, TOK_MINUS_MINUS, lestes::lang::cplus::lex::pp_token::TOK_MINUS_MINUS, TOK_MUTABLE, lestes::lang::cplus::lex::pp_token::TOK_MUTABLE, TOK_NAMESPACE, lestes::lang::cplus::lex::pp_token::TOK_NAMESPACE, TOK_NEW, lestes::lang::cplus::lex::pp_token::TOK_NEW, lestes::lang::cplus::lex::pp_token::TOK_NUMBER_LIT, TOK_OPERATOR, lestes::lang::cplus::lex::pp_token::TOK_OPERATOR, lestes::lang::cplus::lex::pp_token::TOK_OTHER, TOK_PERCENT, lestes::lang::cplus::lex::pp_token::TOK_PERCENT, TOK_PERCENT_EQ, lestes::lang::cplus::lex::pp_token::TOK_PERCENT_EQ, TOK_PLUS, lestes::lang::cplus::lex::pp_token::TOK_PLUS, TOK_PLUS_EQ, lestes::lang::cplus::lex::pp_token::TOK_PLUS_EQ, TOK_PLUS_PLUS, lestes::lang::cplus::lex::pp_token::TOK_PLUS_PLUS, TOK_PRIVATE, lestes::lang::cplus::lex::pp_token::TOK_PRIVATE, TOK_PROTECTED, lestes::lang::cplus::lex::pp_token::TOK_PROTECTED, TOK_PUBLIC, lestes::lang::cplus::lex::pp_token::TOK_PUBLIC, TOK_QMARK, lestes::lang::cplus::lex::pp_token::TOK_QMARK, TOK_REGISTER, lestes::lang::cplus::lex::pp_token::TOK_REGISTER, TOK_REINTERPRET_CAST, lestes::lang::cplus::lex::pp_token::TOK_REINTERPRET_CAST, TOK_RETURN, lestes::lang::cplus::lex::pp_token::TOK_RETURN, TOK_RIGHT_BRACE, lestes::lang::cplus::lex::pp_token::TOK_RIGHT_BRACE, TOK_RIGHT_BRACKET, lestes::lang::cplus::lex::pp_token::TOK_RIGHT_BRACKET, TOK_RIGHT_PAR, lestes::lang::cplus::lex::pp_token::TOK_RIGHT_PAR, TOK_SEMICOLON, lestes::lang::cplus::lex::pp_token::TOK_SEMICOLON, TOK_SHORT, lestes::lang::cplus::lex::pp_token::TOK_SHORT, TOK_SIGNED, lestes::lang::cplus::lex::pp_token::TOK_SIGNED, TOK_SIZEOF, lestes::lang::cplus::lex::pp_token::TOK_SIZEOF, TOK_SLASH, lestes::lang::cplus::lex::pp_token::TOK_SLASH, TOK_SLASH_EQ, lestes::lang::cplus::lex::pp_token::TOK_SLASH_EQ, TOK_STAR, lestes::lang::cplus::lex::pp_token::TOK_STAR, TOK_STAR_EQ, lestes::lang::cplus::lex::pp_token::TOK_STAR_EQ, TOK_STATIC, lestes::lang::cplus::lex::pp_token::TOK_STATIC, TOK_STATIC_CAST, lestes::lang::cplus::lex::pp_token::TOK_STATIC_CAST, lestes::lang::cplus::lex::pp_token::TOK_STRING_LIT, TOK_STRUCT, lestes::lang::cplus::lex::pp_token::TOK_STRUCT, TOK_SWITCH, lestes::lang::cplus::lex::pp_token::TOK_SWITCH, TOK_TEMPLATE, lestes::lang::cplus::lex::pp_token::TOK_TEMPLATE, TOK_THIS, lestes::lang::cplus::lex::pp_token::TOK_THIS, TOK_THROW, lestes::lang::cplus::lex::pp_token::TOK_THROW, TOK_TILDE, lestes::lang::cplus::lex::pp_token::TOK_TILDE, TOK_TRY, lestes::lang::cplus::lex::pp_token::TOK_TRY, TOK_TYPEDEF, lestes::lang::cplus::lex::pp_token::TOK_TYPEDEF, TOK_TYPEID, lestes::lang::cplus::lex::pp_token::TOK_TYPEID, TOK_TYPENAME, lestes::lang::cplus::lex::pp_token::TOK_TYPENAME, TOK_UNION, lestes::lang::cplus::lex::pp_token::TOK_UNION, TOK_UNSIGNED, lestes::lang::cplus::lex::pp_token::TOK_UNSIGNED, TOK_USING, lestes::lang::cplus::lex::pp_token::TOK_USING, TOK_VBAR, lestes::lang::cplus::lex::pp_token::TOK_VBAR, TOK_VBAR_EQ, lestes::lang::cplus::lex::pp_token::TOK_VBAR_EQ, TOK_VBAR_VBAR, lestes::lang::cplus::lex::pp_token::TOK_VBAR_VBAR, TOK_VIRTUAL, lestes::lang::cplus::lex::pp_token::TOK_VIRTUAL, TOK_VOID, lestes::lang::cplus::lex::pp_token::TOK_VOID, TOK_VOLATILE, lestes::lang::cplus::lex::pp_token::TOK_VOLATILE, lestes::lang::cplus::lex::pp_token::TOK_WCHAR, lestes::lang::cplus::lex::pp_token::TOK_WCHAR_LIT, TOK_WCHAR_T, TOK_WHILE, lestes::lang::cplus::lex::pp_token::TOK_WHILE, and lestes::lang::cplus::lex::pp_token::TOK_WSTRING_LIT.
00087 { 00088 preprocessor_logger << "preprocessor::read()\n" << msg::eolog; 00089 00090 ptr<pp_token> t; 00091 ptr<source_location> loc; 00092 ptr<token_value> val; 00093 bool wide; 00094 ptr<lex_literal> lit; 00095 ptr<cpp_token> ct; 00096 00097 while (!ct) { 00098 t = stj->read(); 00099 loc = t->location_get(); 00100 // add proper order 00101 loc = loc->clone_order(order++); 00102 val = t->value_get(); 00103 wide = false; 00104 00105 switch (t->type_get()) { 00106 case pp_token::TOK_FILE_END: 00107 ct = cpp_token::create(loc,cpp_token::TOK_EOF); 00108 break; 00109 case pp_token::TOK_WSTRING_LIT: 00110 wide = true; 00111 // fall through 00112 case pp_token::TOK_STRING_LIT: 00113 ct = cpp_token::create_literal(loc,lex_string_literal::create(wide),val); 00114 break; 00115 case pp_token::TOK_WCHAR_LIT: 00116 wide = true; 00117 // fall through 00118 case pp_token::TOK_CHAR_LIT: 00119 ct = cpp_token::create_literal(loc,lex_character_literal::create(wide,val->content_get().length() > 1),val); 00120 break; 00121 case pp_token::TOK_NUMBER_LIT: 00122 preprocessor_logger << "number literal\n" << msg::eolog; 00123 lit = classify_number(loc,val); 00124 00125 if (!lit) { 00126 preprocessor_logger << "the literal is illformed\n" << msg::eolog; 00127 // create fake zero 00128 lit = lex_integral_literal::create(lex_integral_literal::OCTAL,lex_integral_literal::NONE,0,1); 00129 val = token_value::create("0"); 00130 } 00131 00132 ct = cpp_token::create_literal(loc,lit,val); 00133 // error already reported 00134 break; 00135 case pp_token::TOK_BOOL_LIT: 00136 ct = cpp_token::create_literal(loc,lex_boolean_literal::create(),val); 00137 break; 00138 00139 case pp_token::TOK_LEFT_BRACKET: 00140 ct = cpp_token::create(loc,cpp_token::TOK_LEFT_BRACKET); 00141 break; 00142 case pp_token::TOK_RIGHT_BRACKET: 00143 ct = cpp_token::create(loc,cpp_token::TOK_RIGHT_BRACKET); 00144 break; 00145 case pp_token::TOK_LEFT_BRACE: 00146 ct = cpp_token::create(loc,cpp_token::TOK_LEFT_BRACE); 00147 break; 00148 case pp_token::TOK_RIGHT_BRACE: 00149 ct = cpp_token::create(loc,cpp_token::TOK_RIGHT_BRACE); 00150 break; 00151 case pp_token::TOK_LEFT_PAR: 00152 ct = cpp_token::create(loc,cpp_token::TOK_LEFT_PAR); 00153 break; 00154 case pp_token::TOK_RIGHT_PAR: 00155 ct = cpp_token::create(loc,cpp_token::TOK_RIGHT_PAR); 00156 break; 00157 case pp_token::TOK_SEMICOLON: 00158 ct = cpp_token::create(loc,cpp_token::TOK_SEMICOLON); 00159 break; 00160 case pp_token::TOK_COLON: 00161 ct = cpp_token::create(loc,cpp_token::TOK_COLON); 00162 break; 00163 case pp_token::TOK_QMARK: 00164 ct = cpp_token::create(loc,cpp_token::TOK_QMARK); 00165 break; 00166 case pp_token::TOK_DOT: 00167 ct = cpp_token::create(loc,cpp_token::TOK_DOT); 00168 break; 00169 case pp_token::TOK_PLUS: 00170 ct = cpp_token::create(loc,cpp_token::TOK_PLUS); 00171 break; 00172 case pp_token::TOK_STAR: 00173 ct = cpp_token::create(loc,cpp_token::TOK_STAR); 00174 break; 00175 case pp_token::TOK_PERCENT: 00176 ct = cpp_token::create(loc,cpp_token::TOK_PERCENT); 00177 break; 00178 case pp_token::TOK_SLASH: 00179 ct = cpp_token::create(loc,cpp_token::TOK_SLASH); 00180 break; 00181 case pp_token::TOK_HAT: 00182 ct = cpp_token::create(loc,cpp_token::TOK_HAT); 00183 break; 00184 case pp_token::TOK_AMP: 00185 ct = cpp_token::create(loc,cpp_token::TOK_AMP); 00186 break; 00187 case pp_token::TOK_VBAR: 00188 ct = cpp_token::create(loc,cpp_token::TOK_VBAR); 00189 break; 00190 case pp_token::TOK_TILDE: 00191 ct = cpp_token::create(loc,cpp_token::TOK_TILDE); 00192 break; 00193 case pp_token::TOK_EMARK: 00194 ct = cpp_token::create(loc,cpp_token::TOK_EXCLAMATION); 00195 break; 00196 case pp_token::TOK_EQ: 00197 ct = cpp_token::create(loc,cpp_token::TOK_EQ); 00198 break; 00199 case pp_token::TOK_LT: 00200 ct = cpp_token::create(loc,cpp_token::TOK_LT); 00201 break; 00202 case pp_token::TOK_GT: 00203 ct = cpp_token::create(loc,cpp_token::TOK_GT); 00204 break; 00205 case pp_token::TOK_COMMA: 00206 ct = cpp_token::create(loc,cpp_token::TOK_COMMA); 00207 break; 00208 case pp_token::TOK_MINUS: 00209 ct = cpp_token::create(loc,cpp_token::TOK_MINUS); 00210 break; 00211 case pp_token::TOK_DOT_DOT_DOT: 00212 ct = cpp_token::create(loc,cpp_token::TOK_DOT_DOT_DOT); 00213 break; 00214 case pp_token::TOK_COLON_COLON: 00215 ct = cpp_token::create(loc,cpp_token::TOK_COLON_COLON); 00216 break; 00217 case pp_token::TOK_DOT_STAR: 00218 ct = cpp_token::create(loc,cpp_token::TOK_DOT_STAR); 00219 break; 00220 case pp_token::TOK_PLUS_EQ: 00221 ct = cpp_token::create(loc,cpp_token::TOK_PLUS_EQ); 00222 break; 00223 case pp_token::TOK_MINUS_EQ: 00224 ct = cpp_token::create(loc,cpp_token::TOK_MINUS_EQ); 00225 break; 00226 case pp_token::TOK_STAR_EQ: 00227 ct = cpp_token::create(loc,cpp_token::TOK_STAR_EQ); 00228 break; 00229 case pp_token::TOK_SLASH_EQ: 00230 ct = cpp_token::create(loc,cpp_token::TOK_SLASH_EQ); 00231 break; 00232 case pp_token::TOK_PERCENT_EQ: 00233 ct = cpp_token::create(loc,cpp_token::TOK_PERCENT_EQ); 00234 break; 00235 case pp_token::TOK_HAT_EQ: 00236 ct = cpp_token::create(loc,cpp_token::TOK_HAT_EQ); 00237 break; 00238 case pp_token::TOK_AMP_EQ: 00239 ct = cpp_token::create(loc,cpp_token::TOK_AMP_EQ); 00240 break; 00241 case pp_token::TOK_VBAR_EQ: 00242 ct = cpp_token::create(loc,cpp_token::TOK_VBAR_EQ); 00243 break; 00244 case pp_token::TOK_LT_LT: 00245 ct = cpp_token::create(loc,cpp_token::TOK_LT_LT); 00246 break; 00247 case pp_token::TOK_GT_GT: 00248 ct = cpp_token::create(loc,cpp_token::TOK_GT_GT); 00249 break; 00250 case pp_token::TOK_LT_LT_EQ: 00251 ct = cpp_token::create(loc,cpp_token::TOK_LT_LT_EQ); 00252 break; 00253 case pp_token::TOK_GT_GT_EQ: 00254 ct = cpp_token::create(loc,cpp_token::TOK_GT_GT_EQ); 00255 break; 00256 case pp_token::TOK_EQ_EQ: 00257 ct = cpp_token::create(loc,cpp_token::TOK_EQ_EQ); 00258 break; 00259 case pp_token::TOK_EMARK_EQ: 00260 ct = cpp_token::create(loc,cpp_token::TOK_EXCLAMATION_EQ); 00261 break; 00262 case pp_token::TOK_LT_EQ: 00263 ct = cpp_token::create(loc,cpp_token::TOK_LT_EQ); 00264 break; 00265 case pp_token::TOK_GT_EQ: 00266 ct = cpp_token::create(loc,cpp_token::TOK_GT_EQ); 00267 break; 00268 case pp_token::TOK_AMP_AMP: 00269 ct = cpp_token::create(loc,cpp_token::TOK_AMP_AMP); 00270 break; 00271 case pp_token::TOK_VBAR_VBAR: 00272 ct = cpp_token::create(loc,cpp_token::TOK_VBAR_VBAR); 00273 break; 00274 case pp_token::TOK_PLUS_PLUS: 00275 ct = cpp_token::create(loc,cpp_token::TOK_PLUS_PLUS); 00276 break; 00277 case pp_token::TOK_MINUS_MINUS: 00278 ct = cpp_token::create(loc,cpp_token::TOK_MINUS_MINUS); 00279 break; 00280 case pp_token::TOK_MINUS_GT_STAR: 00281 ct = cpp_token::create(loc,cpp_token::TOK_MINUS_GT_STAR); 00282 break; 00283 case pp_token::TOK_MINUS_GT: 00284 ct = cpp_token::create(loc,cpp_token::TOK_MINUS_GT); 00285 break; 00286 case pp_token::TOK_ASM: 00287 ct = cpp_token::create(loc,cpp_token::TOK_ASM); 00288 break; 00289 case pp_token::TOK_AUTO: 00290 ct = cpp_token::create(loc,cpp_token::TOK_AUTO); 00291 break; 00292 case pp_token::TOK_BOOL: 00293 ct = cpp_token::create(loc,cpp_token::TOK_BOOL); 00294 break; 00295 case pp_token::TOK_BREAK: 00296 ct = cpp_token::create(loc,cpp_token::TOK_BREAK); 00297 break; 00298 case pp_token::TOK_CASE: 00299 ct = cpp_token::create(loc,cpp_token::TOK_CASE); 00300 break; 00301 case pp_token::TOK_CATCH: 00302 ct = cpp_token::create(loc,cpp_token::TOK_CATCH); 00303 break; 00304 case pp_token::TOK_CHAR: 00305 ct = cpp_token::create(loc,cpp_token::TOK_CHAR); 00306 break; 00307 case pp_token::TOK_CLASS: 00308 ct = cpp_token::create(loc,cpp_token::TOK_CLASS); 00309 break; 00310 case pp_token::TOK_CONST: 00311 ct = cpp_token::create(loc,cpp_token::TOK_CONST); 00312 break; 00313 case pp_token::TOK_CONST_CAST: 00314 ct = cpp_token::create(loc,cpp_token::TOK_CONST_CAST); 00315 break; 00316 case pp_token::TOK_CONTINUE: 00317 ct = cpp_token::create(loc,cpp_token::TOK_CONTINUE); 00318 break; 00319 case pp_token::TOK_DEFAULT: 00320 ct = cpp_token::create(loc,cpp_token::TOK_DEFAULT); 00321 break; 00322 case pp_token::TOK_DELETE: 00323 ct = cpp_token::create(loc,cpp_token::TOK_DELETE); 00324 break; 00325 case pp_token::TOK_DO: 00326 ct = cpp_token::create(loc,cpp_token::TOK_DO); 00327 break; 00328 case pp_token::TOK_DOUBLE: 00329 ct = cpp_token::create(loc,cpp_token::TOK_DOUBLE); 00330 break; 00331 case pp_token::TOK_DYNAMIC_CAST: 00332 ct = cpp_token::create(loc,cpp_token::TOK_DYNAMIC_CAST); 00333 break; 00334 case pp_token::TOK_ELSE: 00335 ct = cpp_token::create(loc,cpp_token::TOK_ELSE); 00336 break; 00337 case pp_token::TOK_ENUM: 00338 ct = cpp_token::create(loc,cpp_token::TOK_ENUM); 00339 break; 00340 case pp_token::TOK_EXPLICIT: 00341 ct = cpp_token::create(loc,cpp_token::TOK_EXPLICIT); 00342 break; 00343 case pp_token::TOK_EXPORT: 00344 ct = cpp_token::create(loc,cpp_token::TOK_EXPORT); 00345 break; 00346 case pp_token::TOK_EXTERN: 00347 ct = cpp_token::create(loc,cpp_token::TOK_EXTERN); 00348 break; 00349 case pp_token::TOK_FLOAT: 00350 ct = cpp_token::create(loc,cpp_token::TOK_FLOAT); 00351 break; 00352 case pp_token::TOK_FOR: 00353 ct = cpp_token::create(loc,cpp_token::TOK_FOR); 00354 break; 00355 case pp_token::TOK_FRIEND: 00356 ct = cpp_token::create(loc,cpp_token::TOK_FRIEND); 00357 break; 00358 case pp_token::TOK_GOTO: 00359 ct = cpp_token::create(loc,cpp_token::TOK_GOTO); 00360 break; 00361 case pp_token::TOK_IF: 00362 ct = cpp_token::create(loc,cpp_token::TOK_IF); 00363 break; 00364 case pp_token::TOK_INLINE: 00365 ct = cpp_token::create(loc,cpp_token::TOK_INLINE); 00366 break; 00367 case pp_token::TOK_INT: 00368 ct = cpp_token::create(loc,cpp_token::TOK_INT); 00369 break; 00370 case pp_token::TOK_LONG: 00371 ct = cpp_token::create(loc,cpp_token::TOK_LONG); 00372 break; 00373 case pp_token::TOK_MUTABLE: 00374 ct = cpp_token::create(loc,cpp_token::TOK_MUTABLE); 00375 break; 00376 case pp_token::TOK_NAMESPACE: 00377 ct = cpp_token::create(loc,cpp_token::TOK_NAMESPACE); 00378 break; 00379 case pp_token::TOK_NEW: 00380 ct = cpp_token::create(loc,cpp_token::TOK_NEW); 00381 break; 00382 case pp_token::TOK_OPERATOR: 00383 ct = cpp_token::create(loc,cpp_token::TOK_OPERATOR); 00384 break; 00385 case pp_token::TOK_PRIVATE: 00386 ct = cpp_token::create(loc,cpp_token::TOK_PRIVATE); 00387 break; 00388 case pp_token::TOK_PROTECTED: 00389 ct = cpp_token::create(loc,cpp_token::TOK_PROTECTED); 00390 break; 00391 case pp_token::TOK_PUBLIC: 00392 ct = cpp_token::create(loc,cpp_token::TOK_PUBLIC); 00393 break; 00394 case pp_token::TOK_REGISTER: 00395 ct = cpp_token::create(loc,cpp_token::TOK_REGISTER); 00396 break; 00397 case pp_token::TOK_REINTERPRET_CAST: 00398 ct = cpp_token::create(loc,cpp_token::TOK_REINTERPRET_CAST); 00399 break; 00400 case pp_token::TOK_RETURN: 00401 ct = cpp_token::create(loc,cpp_token::TOK_RETURN); 00402 break; 00403 case pp_token::TOK_SHORT: 00404 ct = cpp_token::create(loc,cpp_token::TOK_SHORT); 00405 break; 00406 case pp_token::TOK_SIGNED: 00407 ct = cpp_token::create(loc,cpp_token::TOK_SIGNED); 00408 break; 00409 case pp_token::TOK_SIZEOF: 00410 ct = cpp_token::create(loc,cpp_token::TOK_SIZEOF); 00411 break; 00412 case pp_token::TOK_STATIC: 00413 ct = cpp_token::create(loc,cpp_token::TOK_STATIC); 00414 break; 00415 case pp_token::TOK_STATIC_CAST: 00416 ct = cpp_token::create(loc,cpp_token::TOK_STATIC_CAST); 00417 break; 00418 case pp_token::TOK_STRUCT: 00419 ct = cpp_token::create(loc,cpp_token::TOK_STRUCT); 00420 break; 00421 case pp_token::TOK_SWITCH: 00422 ct = cpp_token::create(loc,cpp_token::TOK_SWITCH); 00423 break; 00424 case pp_token::TOK_TEMPLATE: 00425 ct = cpp_token::create(loc,cpp_token::TOK_TEMPLATE); 00426 break; 00427 case pp_token::TOK_THIS: 00428 ct = cpp_token::create(loc,cpp_token::TOK_THIS); 00429 break; 00430 case pp_token::TOK_THROW: 00431 ct = cpp_token::create(loc,cpp_token::TOK_THROW); 00432 break; 00433 case pp_token::TOK_TRY: 00434 ct = cpp_token::create(loc,cpp_token::TOK_TRY); 00435 break; 00436 case pp_token::TOK_TYPEDEF: 00437 ct = cpp_token::create(loc,cpp_token::TOK_TYPEDEF); 00438 break; 00439 case pp_token::TOK_TYPEID: 00440 ct = cpp_token::create(loc,cpp_token::TOK_TYPEID); 00441 break; 00442 case pp_token::TOK_TYPENAME: 00443 ct = cpp_token::create(loc,cpp_token::TOK_TYPENAME); 00444 break; 00445 case pp_token::TOK_UNION: 00446 ct = cpp_token::create(loc,cpp_token::TOK_UNION); 00447 break; 00448 case pp_token::TOK_UNSIGNED: 00449 ct = cpp_token::create(loc,cpp_token::TOK_UNSIGNED); 00450 break; 00451 case pp_token::TOK_USING: 00452 ct = cpp_token::create(loc,cpp_token::TOK_USING); 00453 break; 00454 case pp_token::TOK_VIRTUAL: 00455 ct = cpp_token::create(loc,cpp_token::TOK_VIRTUAL); 00456 break; 00457 case pp_token::TOK_VOID: 00458 ct = cpp_token::create(loc,cpp_token::TOK_VOID); 00459 break; 00460 case pp_token::TOK_VOLATILE: 00461 ct = cpp_token::create(loc,cpp_token::TOK_VOLATILE); 00462 break; 00463 case pp_token::TOK_WCHAR: 00464 ct = cpp_token::create(loc,cpp_token::TOK_WCHAR_T); 00465 break; 00466 case pp_token::TOK_WHILE: 00467 ct = cpp_token::create(loc,cpp_token::TOK_WHILE); 00468 break; 00469 case pp_token::TOK_IDENT: 00470 ct = cpp_token::create(loc,cpp_token::TOK_IDENT,val); 00471 break; 00472 case pp_token::TOK_HASH: 00473 case pp_token::TOK_HASH_HASH: 00474 // invalid token 00475 report << invalid_cpp_token << t->spelling_get() << loc; 00476 break; 00477 case pp_token::TOK_OTHER: 00478 // stray character 00479 report << stray_character << t->spelling_get() << loc; 00480 break; 00481 default: 00482 lassert2(false,"Unexpected token in conversion"); 00483 break; 00484 } 00485 } 00486 00487 preprocessor_logger << "returning " << static_cast<ulint>(ct->type_get()) << "\n" << msg::eolog; 00488 preprocessor_logger << "preprocessor::read() end\n" << msg::eolog; 00489 return ct; 00490 }
| ptr< preprocessor > lestes::lang::cplus::lex::preprocessor::create | ( | const ptr< file_system > & | a_fs, | |
| const lstring & | file_name | |||
| ) | [static] |
Returns new instance.
Returns new preprocessor for given file.
| a_fs | The file system binding. | |
| file_name | The full name of the file to process. |
Definition at line 848 of file preprocessor.cc.
References preprocessor().
00849 { 00850 return new preprocessor(a_fs,file_name); 00851 }
| void lestes::lang::cplus::lex::preprocessor::gc_mark | ( | void | ) | [protected, virtual] |
Marks the object.
Marks the object.
Reimplemented from lestes::std::mem::keystone.
Definition at line 833 of file preprocessor.cc.
References eva, fs, lestes::std::mem::keystone::gc_mark(), spr, stj, and str.
00834 { 00835 fs.gc_mark(); 00836 eva.gc_mark(); 00837 spr.gc_mark(); 00838 str.gc_mark(); 00839 stj.gc_mark(); 00840 ::lestes::std::object::gc_mark(); 00841 }
| ptr< lex_literal > lestes::lang::cplus::lex::preprocessor::classify_number | ( | const ptr< source_location > & | loc, | |
| const ptr< token_value > & | num | |||
| ) | [private] |
Classifies number.
Attempts to parse preprocessing number. Returns literal properties.
num != NULL
The value matches preprocessing number.
| loc | The location of the number. | |
| num | The number to classify. |
Definition at line 501 of file preprocessor.cc.
References BEGIN, lestes::lang::cplus::lex::lex_floating_literal::create(), lestes::lang::cplus::lex::lex_integral_literal::create(), lestes::msg::eolog, lestes::lang::cplus::lex::lex_floating_literal::FLOAT, lestes::lang::cplus::lex::floating_exponent_empty, lestes::lang::cplus::lex::floating_suffix_invalid, fs, lestes::lang::cplus::lex::lex_integral_literal::HEXADECIMAL, lestes::lang::cplus::lex::integral_empty, lestes::lang::cplus::lex::integral_suffix_invalid, lestes::lang::cplus::lex::invalid_character_in_number, lassert, lassert2, lestes::lang::cplus::lex::lex_floating_literal::LONG, lestes::lang::cplus::lex::lex_integral_literal::LONG, lestes::lang::cplus::lex::lex_floating_literal::NONE, lestes::lang::cplus::lex::lex_integral_literal::NONE, lestes::lang::cplus::lex::lex_integral_literal::OCTAL, lestes::report, str, u, lestes::lang::cplus::lex::lex_integral_literal::UNSIGNED, lestes::lang::cplus::lex::lex_integral_literal::UNSIGNED_LONG, and lestes::lang::cplus::lex::ZERO.
Referenced by read().
00502 { 00503 preprocessor_logger << "preprocessor::classify_number()\n" << msg::eolog; 00504 00505 lassert(loc); 00506 lassert(num); 00507 00508 // the states of the parser 00509 enum { 00510 BEGIN, 00511 ZERO, 00512 OCTAL, 00513 DECIMAL, 00514 HEXADECIMAL_START, 00515 HEXADECIMAL, 00516 FLOAT_INTEGRAL, 00517 FLOAT_FRACTION, 00518 FLOAT_EXPONENT_SIGN, 00519 FLOAT_EXPONENT_START, 00520 FLOAT_EXPONENT, 00521 FLOAT_SUFFIX, 00522 FLOAT_END, 00523 INTEGRAL_SUFFIX, 00524 } fstate = BEGIN; 00525 00526 ucn_string str(num->content_get()); 00527 ucn u; 00528 lex_integral_literal::base_type base = lex_integral_literal::OCTAL; 00529 bool long_suffix = false; 00530 bool unsigned_suffix = false; 00531 bool float_suffix = false; 00532 ptr<lex_literal> literal; 00533 00534 for (ucn_string::iterator sit = str.begin(), send = str.end(); 00535 sit != send; ) { 00536 u = *sit; 00537 00538 preprocessor_logger << "fstate = " << fstate["bzodhHI.+eEfFu"] << ' ' << (ulint)u << '\n' << msg::eolog; 00539 00540 if (!character::is_basic(u) || u == character::ascii_underscore) { 00541 // bad character in number 00542 report << invalid_character_in_number << loc; 00543 goto err; 00544 } 00545 switch (fstate) { 00546 case BEGIN: 00547 ++sit; 00548 switch (u) { 00549 case character::ascii_digit_0: 00550 fstate = ZERO; 00551 break; 00552 case character::ascii_digit_1: 00553 case character::ascii_digit_2: 00554 case character::ascii_digit_3: 00555 case character::ascii_digit_4: 00556 case character::ascii_digit_5: 00557 case character::ascii_digit_6: 00558 case character::ascii_digit_7: 00559 case character::ascii_digit_8: 00560 case character::ascii_digit_9: 00561 fstate = DECIMAL; 00562 break; 00563 case character::ascii_dot: 00564 fstate = FLOAT_FRACTION; 00565 break; 00566 default: 00567 lassert2(false,"You should never get here"); 00568 } 00569 break; 00570 case ZERO: 00571 if (u == character::ascii_lower_x || 00572 u == character::ascii_upper_x) { 00573 fstate = HEXADECIMAL_START; 00574 ++sit; 00575 } else if (character::is_odigit(u)) { 00576 fstate = OCTAL; 00577 } else 00578 fstate = INTEGRAL_SUFFIX; 00579 break; 00580 case OCTAL: 00581 if (character::is_odigit(u)) 00582 ++sit; 00583 else if (character::is_digit(u)) 00584 fstate = FLOAT_INTEGRAL; 00585 else if (u == character::ascii_dot) { 00586 fstate = FLOAT_FRACTION; 00587 ++sit; 00588 } else 00589 fstate = INTEGRAL_SUFFIX; 00590 break; 00591 case DECIMAL: 00592 if (character::is_digit(u)) 00593 ++sit; 00594 else if (u == character::ascii_dot) { 00595 ++sit; 00596 fstate = FLOAT_FRACTION; 00597 } else if (u == character::ascii_lower_e || 00598 u == character::ascii_upper_e) { 00599 ++sit; 00600 fstate = FLOAT_EXPONENT_SIGN; 00601 } else 00602 fstate = INTEGRAL_SUFFIX; 00603 break; 00604 case HEXADECIMAL_START: 00605 if (character::is_xdigit(u)) { 00606 ++sit; 00607 fstate = HEXADECIMAL; 00608 base = lex_integral_literal::HEXADECIMAL; 00609 } else 00610 fstate = INTEGRAL_SUFFIX; 00611 break; 00612 case HEXADECIMAL: 00613 if (character::is_xdigit(u)) 00614 ++sit; 00615 else 00616 fstate = INTEGRAL_SUFFIX; 00617 break; 00618 case FLOAT_INTEGRAL: 00619 if (character::is_digit(u)) 00620 ++sit; 00621 else if (u == character::ascii_dot) { 00622 ++sit; 00623 fstate = FLOAT_FRACTION; 00624 } else if (u == character::ascii_lower_e || 00625 u == character::ascii_upper_e) { 00626 ++sit; 00627 fstate = FLOAT_EXPONENT_SIGN; 00628 } else 00629 fstate = FLOAT_SUFFIX; 00630 break; 00631 case FLOAT_FRACTION: 00632 if (character::is_digit(u)) 00633 ++sit; 00634 else if (u == character::ascii_lower_e || 00635 u == character::ascii_upper_e) { 00636 ++sit; 00637 fstate = FLOAT_EXPONENT_SIGN; 00638 } else 00639 fstate = FLOAT_SUFFIX; 00640 break; 00641 case FLOAT_EXPONENT_SIGN: 00642 if (character::is_digit(u)) { 00643 ++sit; 00644 fstate = FLOAT_EXPONENT; 00645 } else if (u == character::ascii_plus) { 00646 ++sit; 00647 fstate = FLOAT_EXPONENT_START; 00648 } else if (u == character::ascii_minus) { 00649 ++sit; 00650 fstate = FLOAT_EXPONENT_START; 00651 } else { 00652 // no digits in exponent 00653 report << floating_exponent_empty << loc; 00654 goto err; 00655 } 00656 break; 00657 case FLOAT_EXPONENT_START: 00658 if (character::is_digit(u)) { 00659 ++sit; 00660 fstate = FLOAT_EXPONENT; 00661 } else { 00662 // no digits in exponent 00663 report << floating_exponent_empty << loc; 00664 goto err; 00665 } 00666 break; 00667 case FLOAT_EXPONENT: 00668 if (character::is_digit(u)) 00669 ++sit; 00670 else { 00671 fstate = FLOAT_SUFFIX; 00672 } 00673 break; 00674 case FLOAT_SUFFIX: 00675 ++sit; 00676 if (u == character::ascii_lower_f || 00677 u == character::ascii_upper_f) { 00678 float_suffix = true; 00679 fstate = FLOAT_END; 00680 break; 00681 } else if (u == character::ascii_lower_l || 00682 u == character::ascii_upper_l) { 00683 long_suffix = true; 00684 fstate = FLOAT_END; 00685 break; 00686 } 00687 // fall through 00688 case FLOAT_END: 00689 // bad float suffix 00690 report << floating_suffix_invalid << loc; 00691 goto err; 00692 case INTEGRAL_SUFFIX: 00693 ++sit; 00694 if (u == character::ascii_lower_u || 00695 u == character::ascii_upper_u) { 00696 if (unsigned_suffix) { 00697 // bad integral suffix 00698 report << integral_suffix_invalid << loc; 00699 goto err; 00700 } 00701 unsigned_suffix = true; 00702 } else if (u == character::ascii_lower_l || 00703 u == character::ascii_upper_l) { 00704 if (long_suffix) { 00705 // bad integral suffix 00706 report << integral_suffix_invalid << loc; 00707 goto err; 00708 } 00709 long_suffix = true; 00710 } else { 00711 // bad integral suffix 00712 report << integral_suffix_invalid << loc; 00713 goto err; 00714 } 00715 break; 00716 default: 00717 lassert2(false,"You should never get here"); 00718 break; 00719 } 00720 } 00721 00722 switch (fstate) { 00723 case ZERO: 00724 case OCTAL: 00725 case DECIMAL: 00726 case HEXADECIMAL: 00727 case INTEGRAL_SUFFIX: 00728 { 00729 ucn_string::size_type start = (base == lex_integral_literal::HEXADECIMAL) ? 2 : 0; 00730 ucn_string::size_type end = str.length(); 00731 lex_integral_literal::suffix_type suffix = lex_integral_literal::NONE; 00732 00733 if (unsigned_suffix) { 00734 if (long_suffix) { 00735 suffix = lex_integral_literal::UNSIGNED_LONG; 00736 end -= 2; 00737 } else { 00738 suffix = lex_integral_literal::UNSIGNED; 00739 end--; 00740 } 00741 } else if (long_suffix) { 00742 suffix = lex_integral_literal::LONG; 00743 end--; 00744 } 00745 00746 preprocessor_logger << "integral su = " << (ulint)suffix << 00747 " s = " << start << " e = " << end << "\n" << msg::eolog; 00748 00749 literal = lex_integral_literal::create(base,suffix,start,end); 00750 break; 00751 } 00752 case FLOAT_FRACTION: 00753 case FLOAT_EXPONENT: 00754 case FLOAT_SUFFIX: 00755 case FLOAT_END: 00756 { 00757 lex_floating_literal::suffix_type suffix = lex_floating_literal::NONE; 00758 if (long_suffix) 00759 suffix = lex_floating_literal::LONG; 00760 else if (float_suffix) 00761 suffix = lex_floating_literal::FLOAT; 00762 00763 ucn_string::iterator sit = str.begin(), send = str.end(); 00764 00765 ucn_string::size_type is = 0, ie = is; 00766 00767 while (sit != send && character::is_digit(*sit)) { 00768 ++ie; 00769 ++sit; 00770 } 00771 00772 ucn_string::size_type fs = ie, fe = fs; 00773 if (sit != send && *sit == character::ascii_dot) { 00774 ++sit; 00775 ++fs; 00776 ++fe; 00777 00778 while (sit != send && character::is_digit(*sit)) { 00779 ++fe; 00780 ++sit; 00781 } 00782 } 00783 00784 bool neg = false; 00785 ucn_string::size_type es = fe, ee = es; 00786 if (sit != send && (*sit == character::ascii_lower_e || *sit == character::ascii_upper_e)) { 00787 ++sit; 00788 ++es; 00789 ++ee; 00790 00791 if (sit != send && !character::is_digit(*sit)) { 00792 neg = *sit == character::ascii_minus; 00793 ++sit; 00794 ++es; 00795 ++ee; 00796 } 00797 00798 while (sit != send && character::is_digit(*sit)) { 00799 ++ee; 00800 ++sit; 00801 } 00802 } 00803 00804 preprocessor_logger << "floating su = " << (ulint)suffix << " n = " << neg << 00805 " is = " << is << " ie = " << ie << " fs = " << fs << " fe = " << fe << 00806 " es = " << es << " ee = " << ee << "\n" << msg::eolog; 00807 00808 literal = lex_floating_literal::create(suffix,neg,is,ie,fs,fe,es,ee); 00809 } 00810 break; 00811 case FLOAT_EXPONENT_SIGN: 00812 case FLOAT_EXPONENT_START: 00813 // float exponent with no digits 00814 report << floating_exponent_empty << loc; 00815 break; 00816 case HEXADECIMAL_START: 00817 // hexa with no digits 00818 report << integral_empty << loc; 00819 break; 00820 default: 00821 lassert2(false,"You should never get here"); 00822 } 00823 00824 err: 00825 preprocessor_logger << "preprocessor::classify_number() end\n" << msg::eolog; 00826 00827 return literal; 00828 }
| preprocessor& lestes::lang::cplus::lex::preprocessor::operator= | ( | const preprocessor & | ) | [private] |
Hides assignment operator.
ulint lestes::lang::cplus::lex::preprocessor::order [private] |
The order of tokens in translation unit.
Definition at line 85 of file preprocessor.hh.
Referenced by read().
srp<file_system> lestes::lang::cplus::lex::preprocessor::fs [private] |
File system binding.
Definition at line 87 of file preprocessor.hh.
Referenced by classify_number(), and gc_mark().
srp<evaluator> lestes::lang::cplus::lex::preprocessor::eva [private] |
Evaluator.
Definition at line 89 of file preprocessor.hh.
Referenced by gc_mark(), and pragma_flag_get().
srp<space_remover> lestes::lang::cplus::lex::preprocessor::spr [private] |
srp<string_translator> lestes::lang::cplus::lex::preprocessor::str [private] |
String translator.
Definition at line 93 of file preprocessor.hh.
Referenced by classify_number(), and gc_mark().
srp<string_joiner> lestes::lang::cplus::lex::preprocessor::stj [private] |
1.5.1-20070107