Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
xpath_lexer Class Reference

Public Member Functions

 xpath_lexer (const char_t *query)
const char_t * state () const
void next ()
lexeme_t current () const
const char_t * current_pos () const
const xpath_lexer_stringcontents () const

Detailed Description

Definition at line 9247 of file pugixml.cc.

Constructor & Destructor Documentation

◆ xpath_lexer()

xpath_lexer::xpath_lexer ( const char_t * query)
inlineexplicit

Definition at line 9256 of file pugixml.cc.

9256 : _cur(query)
9257 {
9258 next();
9259 }
void next()
Definition pugixml.cc:9266

Member Function Documentation

◆ contents()

const xpath_lexer_string & xpath_lexer::contents ( ) const
inline

Definition at line 9545 of file pugixml.cc.

9546 {
9547 assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string);
9548
9549 return _cur_lexeme_contents;
9550 }
@ lex_quoted_string
Definition pugixml.cc:9215
@ lex_var_ref
Definition pugixml.cc:9212
@ lex_string
Definition pugixml.cc:9221
@ lex_number
Definition pugixml.cc:9216

Referenced by xpath_parser::binary_op_t::parse().

◆ current()

lexeme_t xpath_lexer::current ( ) const
inline

Definition at line 9535 of file pugixml.cc.

9536 {
9537 return _cur_lexeme;
9538 }

Referenced by xpath_parser::binary_op_t::parse().

◆ current_pos()

const char_t * xpath_lexer::current_pos ( ) const
inline

Definition at line 9540 of file pugixml.cc.

9541 {
9542 return _cur_lexeme_pos;
9543 }

◆ next()

void xpath_lexer::next ( )
inline

Definition at line 9266 of file pugixml.cc.

9267 {
9268 const char_t* cur = _cur;
9269
9270 while (PUGI__IS_CHARTYPE(*cur, ct_space)) ++cur;
9271
9272 // save lexeme position for error reporting
9273 _cur_lexeme_pos = cur;
9274
9275 switch (*cur)
9276 {
9277 case 0:
9278 _cur_lexeme = lex_eof;
9279 break;
9280
9281 case '>':
9282 if (*(cur+1) == '=')
9283 {
9284 cur += 2;
9285 _cur_lexeme = lex_greater_or_equal;
9286 }
9287 else
9288 {
9289 cur += 1;
9290 _cur_lexeme = lex_greater;
9291 }
9292 break;
9293
9294 case '<':
9295 if (*(cur+1) == '=')
9296 {
9297 cur += 2;
9298 _cur_lexeme = lex_less_or_equal;
9299 }
9300 else
9301 {
9302 cur += 1;
9303 _cur_lexeme = lex_less;
9304 }
9305 break;
9306
9307 case '!':
9308 if (*(cur+1) == '=')
9309 {
9310 cur += 2;
9311 _cur_lexeme = lex_not_equal;
9312 }
9313 else
9314 {
9315 _cur_lexeme = lex_none;
9316 }
9317 break;
9318
9319 case '=':
9320 cur += 1;
9321 _cur_lexeme = lex_equal;
9322
9323 break;
9324
9325 case '+':
9326 cur += 1;
9327 _cur_lexeme = lex_plus;
9328
9329 break;
9330
9331 case '-':
9332 cur += 1;
9333 _cur_lexeme = lex_minus;
9334
9335 break;
9336
9337 case '*':
9338 cur += 1;
9339 _cur_lexeme = lex_multiply;
9340
9341 break;
9342
9343 case '|':
9344 cur += 1;
9345 _cur_lexeme = lex_union;
9346
9347 break;
9348
9349 case '$':
9350 cur += 1;
9351
9353 {
9354 _cur_lexeme_contents.begin = cur;
9355
9356 while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
9357
9358 if (cur[0] == ':' && PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // qname
9359 {
9360 cur++; // :
9361
9362 while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
9363 }
9364
9365 _cur_lexeme_contents.end = cur;
9366
9367 _cur_lexeme = lex_var_ref;
9368 }
9369 else
9370 {
9371 _cur_lexeme = lex_none;
9372 }
9373
9374 break;
9375
9376 case '(':
9377 cur += 1;
9378 _cur_lexeme = lex_open_brace;
9379
9380 break;
9381
9382 case ')':
9383 cur += 1;
9384 _cur_lexeme = lex_close_brace;
9385
9386 break;
9387
9388 case '[':
9389 cur += 1;
9390 _cur_lexeme = lex_open_square_brace;
9391
9392 break;
9393
9394 case ']':
9395 cur += 1;
9396 _cur_lexeme = lex_close_square_brace;
9397
9398 break;
9399
9400 case ',':
9401 cur += 1;
9402 _cur_lexeme = lex_comma;
9403
9404 break;
9405
9406 case '/':
9407 if (*(cur+1) == '/')
9408 {
9409 cur += 2;
9410 _cur_lexeme = lex_double_slash;
9411 }
9412 else
9413 {
9414 cur += 1;
9415 _cur_lexeme = lex_slash;
9416 }
9417 break;
9418
9419 case '.':
9420 if (*(cur+1) == '.')
9421 {
9422 cur += 2;
9423 _cur_lexeme = lex_double_dot;
9424 }
9425 else if (PUGI__IS_CHARTYPEX(*(cur+1), ctx_digit))
9426 {
9427 _cur_lexeme_contents.begin = cur; // .
9428
9429 ++cur;
9430
9431 while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
9432
9433 _cur_lexeme_contents.end = cur;
9434
9435 _cur_lexeme = lex_number;
9436 }
9437 else
9438 {
9439 cur += 1;
9440 _cur_lexeme = lex_dot;
9441 }
9442 break;
9443
9444 case '@':
9445 cur += 1;
9446 _cur_lexeme = lex_axis_attribute;
9447
9448 break;
9449
9450 case '"':
9451 case '\'':
9452 {
9453 char_t terminator = *cur;
9454
9455 ++cur;
9456
9457 _cur_lexeme_contents.begin = cur;
9458 while (*cur && *cur != terminator) cur++;
9459 _cur_lexeme_contents.end = cur;
9460
9461 if (!*cur)
9462 _cur_lexeme = lex_none;
9463 else
9464 {
9465 cur += 1;
9466 _cur_lexeme = lex_quoted_string;
9467 }
9468
9469 break;
9470 }
9471
9472 case ':':
9473 if (*(cur+1) == ':')
9474 {
9475 cur += 2;
9476 _cur_lexeme = lex_double_colon;
9477 }
9478 else
9479 {
9480 _cur_lexeme = lex_none;
9481 }
9482 break;
9483
9484 default:
9485 if (PUGI__IS_CHARTYPEX(*cur, ctx_digit))
9486 {
9487 _cur_lexeme_contents.begin = cur;
9488
9489 while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
9490
9491 if (*cur == '.')
9492 {
9493 cur++;
9494
9495 while (PUGI__IS_CHARTYPEX(*cur, ctx_digit)) cur++;
9496 }
9497
9498 _cur_lexeme_contents.end = cur;
9499
9500 _cur_lexeme = lex_number;
9501 }
9502 else if (PUGI__IS_CHARTYPEX(*cur, ctx_start_symbol))
9503 {
9504 _cur_lexeme_contents.begin = cur;
9505
9506 while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
9507
9508 if (cur[0] == ':')
9509 {
9510 if (cur[1] == '*') // namespace test ncname:*
9511 {
9512 cur += 2; // :*
9513 }
9514 else if (PUGI__IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname
9515 {
9516 cur++; // :
9517
9518 while (PUGI__IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
9519 }
9520 }
9521
9522 _cur_lexeme_contents.end = cur;
9523
9524 _cur_lexeme = lex_string;
9525 }
9526 else
9527 {
9528 _cur_lexeme = lex_none;
9529 }
9530 }
9531
9532 _cur = cur;
9533 }
PUGIXML_CHAR char_t
Definition pugixml.hpp:137
@ lex_multiply
Definition pugixml.cc:9210
@ lex_double_slash
Definition pugixml.cc:9218
@ lex_not_equal
Definition pugixml.cc:9203
@ lex_axis_attribute
Definition pugixml.cc:9223
@ lex_less
Definition pugixml.cc:9204
@ lex_equal
Definition pugixml.cc:9202
@ lex_greater_or_equal
Definition pugixml.cc:9207
@ lex_none
Definition pugixml.cc:9201
@ lex_union
Definition pugixml.cc:9211
@ lex_comma
Definition pugixml.cc:9222
@ lex_close_brace
Definition pugixml.cc:9214
@ lex_slash
Definition pugixml.cc:9217
@ lex_dot
Definition pugixml.cc:9224
@ lex_minus
Definition pugixml.cc:9209
@ lex_eof
Definition pugixml.cc:9227
@ lex_plus
Definition pugixml.cc:9208
@ lex_greater
Definition pugixml.cc:9205
@ lex_double_dot
Definition pugixml.cc:9225
@ lex_less_or_equal
Definition pugixml.cc:9206
@ lex_close_square_brace
Definition pugixml.cc:9220
@ lex_open_square_brace
Definition pugixml.cc:9219
@ lex_open_brace
Definition pugixml.cc:9213
@ lex_double_colon
Definition pugixml.cc:9226
#define PUGI__IS_CHARTYPE(c, ct)
Definition pugixml.cc:1915
#define PUGI__IS_CHARTYPEX(c, ct)
Definition pugixml.cc:1916
@ ct_space
Definition pugixml.cc:1850
@ ctx_digit
Definition pugixml.cc:1883
@ ctx_symbol
Definition pugixml.cc:1884
@ ctx_start_symbol
Definition pugixml.cc:1882

Referenced by xpath_lexer().

◆ state()

const char_t * xpath_lexer::state ( ) const
inline

Definition at line 9261 of file pugixml.cc.

9262 {
9263 return _cur;
9264 }

The documentation for this class was generated from the following file: