00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <lestes/common.hh>
00033 #include <lestes/std/file_info.hh>
00034 #include <lestes/std/source_location.hh>
00035 #include <lestes/lang/cplus/lex/pp_lex.hh>
00036 #include <lestes/lang/cplus/lex/pp_token.hh>
00037 #include <lestes/lang/cplus/lex/string_source.hh>
00038 #include <lestes/lang/cplus/lex/encoder_ascii7.hh>
00039
00040 #include <string>
00041 #include <iostream>
00042
00043 package(lestes);
00044 package(lang);
00045 package(cplus);
00046 package(lex);
00047
00048 using namespace ::std;
00049
00050 void pp_lex_test(void)
00051 {
00052 char inp[] =
00053 " [<:]:>}%>{<%#%:##%:%:)(;:?.+*%/^xor&bitand|bitor"
00054 "~compl!not=<>,-::.*+=-=*=/=%=^=xor_eq&=and_eq|=or_eq<<>>"
00055 ">>=<<===!=not_eq<=>=&&and||or++--->*->..."
00056 "asm auto bool break case catch char class const_cast continue default delete do "
00057 "double dynamic_cast else enum explicit export extern float for friend goto if "
00058 "inline int long mutable namespace new operator private protected public register "
00059 "reinterpret_cast return short signed sizeof static static_cast struct switch "
00060 "template this throw try typedef typeid typename union unsigned using virtual "
00061 "void volatile wchar_t while false true define undef pragma error "
00062 "defined ifdef ifndef elif endif "
00063 "\n#include\n#line\n"
00064 "123 007 0xF00 1.23e+45 "
00065 "1eet 0range 0xygen 1.2.3e+e-45 "
00066 "'a''bcd''\\\'\\\"\\?\\\\\\a\\b\\r\\f\\n\\r\\t\\v''\\123\\xFaCe''\\udEaD\\U1234cdef'\n"
00067 "'''\\c\\d\\e\\g\\h\\i''\\xg\\x''\\u\\uabcx\\U\\Uabcdeef\\uf0''unterminated\n"
00068 "\"\"\"a\"\"bcd\"\"\\\'\\\"\\?\\\\\\a\\b\\r\\f\\n\\r\\t\\v\"\"\\123\\xFaCe\"\"\\udEaD\\U1234cdef\"\n"
00069 "\"\\c\\d\\e\\g\\h\\i\"\"\\xg\\x\"\"\\u\\uabcx\\U\\Uabcdef\\uf0\"\"unterminated\n"
00070 "\n";
00071
00072 pp_token_type out[] = {
00073 pp_token::TOK_BLANK,
00074 pp_token::TOK_LEFT_BRACKET,
00075 pp_token::TOK_LEFT_BRACKET,
00076 pp_token::TOK_RIGHT_BRACKET,
00077 pp_token::TOK_RIGHT_BRACKET,
00078 pp_token::TOK_RIGHT_BRACE,
00079 pp_token::TOK_RIGHT_BRACE,
00080 pp_token::TOK_LEFT_BRACE,
00081 pp_token::TOK_LEFT_BRACE,
00082 pp_token::TOK_HASH,
00083 pp_token::TOK_HASH,
00084 pp_token::TOK_HASH_HASH,
00085 pp_token::TOK_HASH_HASH,
00086 pp_token::TOK_RIGHT_PAR,
00087 pp_token::TOK_LEFT_PAR,
00088 pp_token::TOK_SEMICOLON,
00089 pp_token::TOK_COLON,
00090 pp_token::TOK_QMARK,
00091 pp_token::TOK_DOT,
00092 pp_token::TOK_PLUS,
00093 pp_token::TOK_STAR,
00094 pp_token::TOK_PERCENT,
00095 pp_token::TOK_SLASH,
00096 pp_token::TOK_HAT,
00097 pp_token::TOK_HAT,
00098 pp_token::TOK_AMP,
00099 pp_token::TOK_AMP,
00100 pp_token::TOK_VBAR,
00101 pp_token::TOK_VBAR,
00102 pp_token::TOK_TILDE,
00103 pp_token::TOK_TILDE,
00104 pp_token::TOK_EMARK,
00105 pp_token::TOK_EMARK,
00106 pp_token::TOK_EQ,
00107 pp_token::TOK_LT,
00108 pp_token::TOK_GT,
00109 pp_token::TOK_COMMA,
00110 pp_token::TOK_MINUS,
00111 pp_token::TOK_COLON_COLON,
00112 pp_token::TOK_DOT_STAR,
00113 pp_token::TOK_PLUS_EQ,
00114 pp_token::TOK_MINUS_EQ,
00115 pp_token::TOK_STAR_EQ,
00116 pp_token::TOK_SLASH_EQ,
00117 pp_token::TOK_PERCENT_EQ,
00118 pp_token::TOK_HAT_EQ,
00119 pp_token::TOK_HAT_EQ,
00120 pp_token::TOK_AMP_EQ,
00121 pp_token::TOK_AMP_EQ,
00122 pp_token::TOK_VBAR_EQ,
00123 pp_token::TOK_VBAR_EQ,
00124 pp_token::TOK_LT_LT,
00125 pp_token::TOK_GT_GT,
00126 pp_token::TOK_GT_GT_EQ,
00127 pp_token::TOK_LT_LT_EQ,
00128 pp_token::TOK_EQ_EQ,
00129 pp_token::TOK_EMARK_EQ,
00130 pp_token::TOK_EMARK_EQ,
00131 pp_token::TOK_LT_EQ,
00132 pp_token::TOK_GT_EQ,
00133 pp_token::TOK_AMP_AMP,
00134 pp_token::TOK_AMP_AMP,
00135 pp_token::TOK_VBAR_VBAR,
00136 pp_token::TOK_VBAR_VBAR,
00137 pp_token::TOK_PLUS_PLUS,
00138 pp_token::TOK_MINUS_MINUS,
00139 pp_token::TOK_MINUS_GT_STAR,
00140 pp_token::TOK_MINUS_GT,
00141 pp_token::TOK_DOT_DOT_DOT,
00142
00143 pp_token::TOK_ASM,
00144 pp_token::TOK_BLANK,
00145 pp_token::TOK_AUTO,
00146 pp_token::TOK_BLANK,
00147 pp_token::TOK_BOOL,
00148 pp_token::TOK_BLANK,
00149 pp_token::TOK_BREAK,
00150 pp_token::TOK_BLANK,
00151 pp_token::TOK_CASE,
00152 pp_token::TOK_BLANK,
00153 pp_token::TOK_CATCH,
00154 pp_token::TOK_BLANK,
00155 pp_token::TOK_CHAR,
00156 pp_token::TOK_BLANK,
00157 pp_token::TOK_CLASS,
00158 pp_token::TOK_BLANK,
00159 pp_token::TOK_CONST_CAST,
00160 pp_token::TOK_BLANK,
00161 pp_token::TOK_CONTINUE,
00162 pp_token::TOK_BLANK,
00163 pp_token::TOK_DEFAULT,
00164 pp_token::TOK_BLANK,
00165 pp_token::TOK_DELETE,
00166 pp_token::TOK_BLANK,
00167 pp_token::TOK_DO,
00168 pp_token::TOK_BLANK,
00169 pp_token::TOK_DOUBLE,
00170 pp_token::TOK_BLANK,
00171 pp_token::TOK_DYNAMIC_CAST,
00172 pp_token::TOK_BLANK,
00173 pp_token::TOK_ELSE,
00174 pp_token::TOK_BLANK,
00175 pp_token::TOK_ENUM,
00176 pp_token::TOK_BLANK,
00177 pp_token::TOK_EXPLICIT,
00178 pp_token::TOK_BLANK,
00179 pp_token::TOK_EXPORT,
00180 pp_token::TOK_BLANK,
00181 pp_token::TOK_EXTERN,
00182 pp_token::TOK_BLANK,
00183 pp_token::TOK_FLOAT,
00184 pp_token::TOK_BLANK,
00185 pp_token::TOK_FOR,
00186 pp_token::TOK_BLANK,
00187 pp_token::TOK_FRIEND,
00188 pp_token::TOK_BLANK,
00189 pp_token::TOK_GOTO,
00190 pp_token::TOK_BLANK,
00191 pp_token::TOK_IF,
00192 pp_token::TOK_BLANK,
00193 pp_token::TOK_INLINE,
00194 pp_token::TOK_BLANK,
00195 pp_token::TOK_INT,
00196 pp_token::TOK_BLANK,
00197 pp_token::TOK_LONG,
00198 pp_token::TOK_BLANK,
00199 pp_token::TOK_MUTABLE,
00200 pp_token::TOK_BLANK,
00201 pp_token::TOK_NAMESPACE,
00202 pp_token::TOK_BLANK,
00203 pp_token::TOK_NEW,
00204 pp_token::TOK_BLANK,
00205 pp_token::TOK_OPERATOR,
00206 pp_token::TOK_BLANK,
00207 pp_token::TOK_PRIVATE,
00208 pp_token::TOK_BLANK,
00209 pp_token::TOK_PROTECTED,
00210 pp_token::TOK_BLANK,
00211 pp_token::TOK_PUBLIC,
00212 pp_token::TOK_BLANK,
00213 pp_token::TOK_REGISTER,
00214 pp_token::TOK_BLANK,
00215 pp_token::TOK_REINTERPRET_CAST,
00216 pp_token::TOK_BLANK,
00217 pp_token::TOK_RETURN,
00218 pp_token::TOK_BLANK,
00219 pp_token::TOK_SHORT,
00220 pp_token::TOK_BLANK,
00221 pp_token::TOK_SIGNED,
00222 pp_token::TOK_BLANK,
00223 pp_token::TOK_SIZEOF,
00224 pp_token::TOK_BLANK,
00225 pp_token::TOK_STATIC,
00226 pp_token::TOK_BLANK,
00227 pp_token::TOK_STATIC_CAST,
00228 pp_token::TOK_BLANK,
00229 pp_token::TOK_STRUCT,
00230 pp_token::TOK_BLANK,
00231 pp_token::TOK_SWITCH,
00232 pp_token::TOK_BLANK,
00233 pp_token::TOK_TEMPLATE,
00234 pp_token::TOK_BLANK,
00235 pp_token::TOK_THIS,
00236 pp_token::TOK_BLANK,
00237 pp_token::TOK_THROW,
00238 pp_token::TOK_BLANK,
00239 pp_token::TOK_TRY,
00240 pp_token::TOK_BLANK,
00241 pp_token::TOK_TYPEDEF,
00242 pp_token::TOK_BLANK,
00243 pp_token::TOK_TYPEID,
00244 pp_token::TOK_BLANK,
00245 pp_token::TOK_TYPENAME,
00246 pp_token::TOK_BLANK,
00247 pp_token::TOK_UNION,
00248 pp_token::TOK_BLANK,
00249 pp_token::TOK_UNSIGNED,
00250 pp_token::TOK_BLANK,
00251 pp_token::TOK_USING,
00252 pp_token::TOK_BLANK,
00253 pp_token::TOK_VIRTUAL,
00254 pp_token::TOK_BLANK,
00255 pp_token::TOK_VOID,
00256 pp_token::TOK_BLANK,
00257 pp_token::TOK_VOLATILE,
00258 pp_token::TOK_BLANK,
00259 pp_token::TOK_WCHAR,
00260 pp_token::TOK_BLANK,
00261 pp_token::TOK_WHILE,
00262 pp_token::TOK_BLANK,
00263 pp_token::TOK_BOOL_LIT,
00264 pp_token::TOK_BLANK,
00265 pp_token::TOK_BOOL_LIT,
00266 pp_token::TOK_BLANK,
00267 pp_token::TOK_DEFINE,
00268 pp_token::TOK_BLANK,
00269 pp_token::TOK_UNDEF,
00270 pp_token::TOK_BLANK,
00271 pp_token::TOK_PRAGMA,
00272 pp_token::TOK_BLANK,
00273 pp_token::TOK_ERROR,
00274 pp_token::TOK_BLANK,
00275 pp_token::TOK_DEFINED,
00276 pp_token::TOK_BLANK,
00277 pp_token::TOK_IFDEF,
00278 pp_token::TOK_BLANK,
00279 pp_token::TOK_IFNDEF,
00280 pp_token::TOK_BLANK,
00281 pp_token::TOK_ELIF,
00282 pp_token::TOK_BLANK,
00283 pp_token::TOK_ENDIF,
00284 pp_token::TOK_BLANK,
00285 pp_token::TOK_LINE_END,
00286 pp_token::TOK_HASH,
00287 pp_token::TOK_INCLUDE,
00288 pp_token::TOK_INCL_SIG,
00289 pp_token::TOK_LINE_END,
00290 pp_token::TOK_HASH,
00291 pp_token::TOK_LINE,
00292 pp_token::TOK_LINE_SIG,
00293 pp_token::TOK_LINE_END,
00294
00295 pp_token::TOK_NUMBER_LIT,
00296 pp_token::TOK_BLANK,
00297 pp_token::TOK_NUMBER_LIT,
00298 pp_token::TOK_BLANK,
00299 pp_token::TOK_NUMBER_LIT,
00300 pp_token::TOK_BLANK,
00301 pp_token::TOK_NUMBER_LIT,
00302 pp_token::TOK_BLANK,
00303
00304 pp_token::TOK_NUMBER_LIT,
00305 pp_token::TOK_BLANK,
00306 pp_token::TOK_NUMBER_LIT,
00307 pp_token::TOK_BLANK,
00308 pp_token::TOK_NUMBER_LIT,
00309 pp_token::TOK_BLANK,
00310 pp_token::TOK_NUMBER_LIT,
00311 pp_token::TOK_BLANK,
00312
00313 pp_token::TOK_CHAR_LIT,
00314 pp_token::TOK_CHAR_LIT,
00315 pp_token::TOK_CHAR_LIT,
00316 pp_token::TOK_CHAR_LIT,
00317 pp_token::TOK_CHAR_LIT,
00318 pp_token::TOK_LINE_END,
00319
00320 pp_token::TOK_CHAR_LIT,
00321 pp_token::TOK_CHAR_LIT,
00322 pp_token::TOK_CHAR_LIT,
00323 pp_token::TOK_CHAR_LIT,
00324 pp_token::TOK_CHAR_LIT,
00325 pp_token::TOK_LINE_END,
00326
00327 pp_token::TOK_STRING_LIT,
00328 pp_token::TOK_STRING_LIT,
00329 pp_token::TOK_STRING_LIT,
00330 pp_token::TOK_STRING_LIT,
00331 pp_token::TOK_STRING_LIT,
00332 pp_token::TOK_STRING_LIT,
00333 pp_token::TOK_LINE_END,
00334
00335 pp_token::TOK_STRING_LIT,
00336 pp_token::TOK_STRING_LIT,
00337 pp_token::TOK_STRING_LIT,
00338 pp_token::TOK_STRING_LIT,
00339 pp_token::TOK_LINE_END,
00340
00341 pp_token::TOK_LINE_END,
00342 pp_token::TOK_FILE_END
00343 };
00344
00345 ptr<file_info> fi = file_info::create("abcd",NULL);
00346
00347 ptr<pre_lex> plx = pre_lex::create(string_source::create(inp),encoder_ascii7::create());
00348 ptr<pp_lex> pp = pp_lex::create(plx,fi);
00349 ptr<pp_token> tok;
00350
00351 ulint i = 0;
00352 do {
00353
00354 tok = pp->read(tok && tok->type_get() == pp_token::TOK_LINE_END);
00355 #if 0
00356 ::std::cerr << " test " << i << " : " <<
00357 tok->name_get() << " " <<
00358 tok->type_get() << " ?== " << (int)out[i] << ""
00359 << ::std::endl;
00360 #if 0
00361 (int)tok->value_get() << " ?== " << (int)ouv[i] << " offset " <<
00362 (int)tok->location_get()->offset_get() << " ?== " << loc[i]->offset_get() << " line " <<
00363 (int)tok->location_get()->line_get() << " ?== " << loc[i]->line_get() << " column " <<
00364 (int)tok->location_get()->column_get() << " ?== " << loc[i]->column_get() << " order " <<
00365 (int)tok->location_get()->order_get() << " ?== " << loc[i]->order_get() << ::std::endl;
00366 #endif
00367 #endif
00368 lassert(is_equal(tok->type_get(),out[i]));
00369
00370 if (tok->type_get() == pp_token::TOK_FILE_END) break;
00371 i++;
00372 } while (true);
00373 }
00374
00375 end_package(lex);
00376 end_package(cplus);
00377 end_package(lang);
00378 end_package(lestes);
00379
00380 int main(void)
00381 {
00382 ::lestes::lang::cplus::lex::pp_lex_test();
00383 return 0;
00384 }
00385
00386