58
58
|______________________________________________________________________*/
60
60
#define PUSH_STATE(state) \
62
yy_push_state(state); \
62
yy_push_state(state); \
65
65
#define POP_STATE() \
67
if (yy_get_start_stack_ptr() > 0) \
70
71
#define PUSH_AND_BEGIN( pushed, new ) \
77
78
/*______________________________________________________________________
242
243
CommentChars ([^:]|":"+[^:)])*":)"
243
244
Comment "(:"{CommentChars}
249
WSOrComment ({WS}|{Comment})+
250
WSOrCommentStar ({WS}|{Comment})*
250
253
/*_____________________________________________________________________
283
286
/*_____________________________________________________________________
289
|______________________________________________________________________*/
290
EQName ({StringLiteral}":"){NCName}
292
/*_____________________________________________________________________
285
294
| Annotation QName definition
286
295
|______________________________________________________________________*/
287
296
AnnotationQName "%"({NCName}":")?{NCName}
386
396
| expression or subexpression.
387
397
|______________________________________________________________________*/
399
<INITIAL,INITIAL_ACCUMULATOR>{
389
401
"(" { return token::LPAR; }
390
402
";" { return token::SEMI; }
391
403
"," { return token::COMMA; }
399
411
".." { return token::DOT_DOT; }
400
412
"." { return token::DOT; }
401
413
"?" { return token::HOOK; }
402
"]" { return token::RBRACK; }
403
414
"$" { return token::DOLLAR; }
404
415
"#" { return token::HASH; }
405
416
":" { return token::COLON; }
545
557
"keys" { return token::KEYS; }
560
/*______________________________________________________________________
563
|______________________________________________________________________*/
565
/* "[" and "]" are not JSONiq tokens, but they have been moved here because
566
of the "{[ ]}" grammar construct */
567
"[" { PUSH_STATE(INITIAL); return token::LBRACK; }
568
"]" { POP_STATE(); return token::RBRACK; }
570
"{[" { PUSH_STATE(INITIAL_ACCUMULATOR); return token::L_ACCUMULATOR_OBJ_UNION; }
572
// This if() disambiguates between the "{[ ]}" grammar construct and the
573
// plain "[ ]" predicate
574
if (YY_START == INITIAL_ACCUMULATOR)
577
return token::R_ACCUMULATOR_OBJ_UNION;
583
return token::RBRACK;
587
"{|" { return token::L_SIMPLE_OBJ_UNION; }
588
"|}" { return token::R_SIMPLE_OBJ_UNION; }
589
"json" { return token::JSON; }
590
"append" { return token::APPEND; }
591
"position" { return token::POSITION; }
592
"json-item" { return token::JSON_ITEM; }
593
"structured-item" { return token::STRUCTURED_ITEM; }
594
"array" { return token::ARRAY; }
595
"object" { return token::OBJECT; }
548
598
/*______________________________________________________________________
613
663
"idiv" { return token::IDIV; }
614
664
"intersect" { return token::INTERSECT; }
615
665
"is" { return token::IS; }
616
"[" { return token::LBRACK; }
617
666
"<=" { return token::LE; }
618
667
"<<" { return token::PRECEDES; }
619
668
"mod" { return token::MOD; }
723
772
{QName} { TRY_SVAL_TOKEN(QNAME_SVAL, put_qname(yytext, yyleng), yytext); }
774
{EQName} { TRY_SVAL_TOKEN(EQNAME_SVAL, put_qname(yytext, yyleng, false, false, true), yytext); }
725
776
{AnnotationQName} { TRY_SVAL_TOKEN(ANNOTATION_QNAME_SVAL, put_qname(yytext+1, yyleng-1), yytext+1); /* skip the % sign */ }
727
778
{AnnotationEQName} { TRY_SVAL_TOKEN(ANNOTATION_EQNAME_SVAL, put_qname(yytext+1, yyleng-1, false, false, true), yytext+1); /* skip the % sign */ }
781
833
/* pop previous state */
782
834
/* ------------------ */
784
if (yy_get_start_stack_ptr() > 0) // The lexer will catch the unexpected right brace and generate a syntax error
786
return token::RBRACE;
835
"}" { POP_STATE(); return token::RBRACE; }
791
839
/* eat up whitespace */
794
/* END <MODE INITIAL> */
797
/*______________________________________________________________________
799
| OCCURRENCE_INDICATOR State
801
| This special state is needed to distinguish occurrence indicators
802
| that appear in the SequenceType production. For instance, compare
803
| "foo instance of baz*" to "baz*foo". In the first case, the "*" is
804
| interpreted as an occurrence indicator, and in the second case, it
805
| must be interpreted as a multiplication operator. But, when in the
806
| OCCURRENCEINDICATOR state, if anything else other than "?", "*",
807
| "+", those symbols must be interpreted in the OPERATOR state. For
808
| instance, this would occur with the expression "foo instance of baz
809
| and $x", with the operator "and".
810
|______________________________________________________________________*/
812
/* <MODE_OCCURRENCE_INDICATOR>{ */
814
/* transition to OPERATOR */
815
/* ---------------------- */
819
return token::OCCURS_HOOK;
824
return token::OCCURS_STAR;
829
return token::OCCURS_PLUS;
833
/* } */ /* MODE_OCCURRENCE_INDICATOR> */
842
} /* END <MODE INITIAL,INITIAL_ACCUMULATOR> */
835
845
/*______________________________________________________________________
871
881
<MODE_ELEM_COMP_CONSTR,MODE_ATTR_COMP_CONSTR,MODE_PI_COMP_CONSTR>"(:" { PUSH_STATE(MODE_EXPR_COMMENT); }
872
<MODE_ELEM_COMP_CONSTR,MODE_ATTR_COMP_CONSTR,MODE_PI_COMP_CONSTR>{S} { /* continue lexing */ }
882
<MODE_ELEM_COMP_CONSTR,MODE_ATTR_COMP_CONSTR,MODE_PI_COMP_CONSTR>{WSstar} { /* continue lexing */ }
873
883
<MODE_ELEM_COMP_CONSTR,MODE_ATTR_COMP_CONSTR,MODE_PI_COMP_CONSTR><<EOF>> { COMP_CONSTR_ROLLBACK(false); }
874
884
<MODE_ELEM_COMP_CONSTR,MODE_ATTR_COMP_CONSTR,MODE_PI_COMP_CONSTR>{CatchAll} { COMP_CONSTR_ROLLBACK(true); }
883
893
| OPERATOR state.
884
894
|______________________________________________________________________*/
886
<MODE_PRAGMA>{QName}{SPNoComment} { BEGIN MODE_PRAGMACONTENTS; TRY_SVAL_TOKEN(QNAME_SVAL, put_qname(yytext, yyleng, true, true), yytext); }
887
<MODE_PRAGMA>{StringLiteral}":"{NCName}{SPNoComment} { BEGIN MODE_PRAGMACONTENTS; TRY_SVAL_TOKEN(EQNAME_SVAL, put_qname(yytext, yyleng, true, true), yytext); }
896
<MODE_PRAGMA>{QName}{WSplus} { BEGIN MODE_PRAGMACONTENTS; TRY_SVAL_TOKEN(QNAME_SVAL, put_qname(yytext, yyleng, true, true), yytext); }
897
<MODE_PRAGMA>{StringLiteral}":"{NCName}{WSplus} { BEGIN MODE_PRAGMACONTENTS; TRY_SVAL_TOKEN(EQNAME_SVAL, put_qname(yytext, yyleng, true, true), yytext); }
888
898
<MODE_PRAGMA>{QName}"#)" { BEGIN INITIAL; TRY_SVAL_TOKEN(QNAME_SVAL_AND_END_PRAGMA, put_qname(yytext, yyleng-2), yytext); }
889
899
<MODE_PRAGMA>{StringLiteral}":"{NCName}"#)" { BEGIN INITIAL; TRY_SVAL_TOKEN(EQNAME_SVAL_AND_END_PRAGMA, put_qname(yytext, yyleng-2), yytext); }
890
<MODE_PRAGMA>{S} { /* continue lexing */ }
900
<MODE_PRAGMA>{WSplus} { /* continue lexing */ }
893
903
/*______________________________________________________________________
916
926
<MODE_START_TAG>\" { BEGIN MODE_QUOTE_ATTRIBUTE_CONTENT; return token::QUOTE; }
917
927
<MODE_START_TAG>\' { BEGIN MODE_APOS_ATTRIBUTE_CONTENT; return token::APOS; }
918
928
<MODE_START_TAG>"=" { return token::EQUALS; }
919
<MODE_START_TAG>{S} { return token::BLANK; }
929
<MODE_START_TAG>{WSstar} { return token::BLANK; }
920
930
<MODE_START_TAG>"/>" { POP_STATE(); return token::EMPTY_TAG_END; }
921
931
<MODE_START_TAG>{QName} { TRY_SVAL_TOKEN (QNAME_SVAL, put_qname(yytext, yyleng), yytext); }
922
932
<MODE_START_TAG>{CatchAll} { yylval->err = getDriver()->unrecognizedCharErr(yytext, *yylloc); return token::UNRECOGNIZED; }
960
970
|______________________________________________________________________*/
962
972
<MODE_END_TAG>">" { POP_STATE(); return token::TAG_END; }
963
<MODE_END_TAG>{QName}{S} { TRY_SVAL_TOKEN (QNAME_SVAL, put_qname(yytext, yyleng, false, true), yytext); }
973
<MODE_END_TAG>{QName}{WSstar} { TRY_SVAL_TOKEN (QNAME_SVAL, put_qname(yytext, yyleng, false, true), yytext); }
964
974
<MODE_END_TAG><<EOF>> { yylval->err = getDriver()->noClosingTagForElementConstructor(*yylloc); return token::UNRECOGNIZED; }
1015
1025
| instruction name are recognized.
1016
1026
|______________________________________________________________________*/
1018
<MODE_PROCESSING_INSTRUCTION>{SP} { BEGIN MODE_PROCESSING_INSTRUCTION_CONTENT; /* continue lexing */ }
1028
<MODE_PROCESSING_INSTRUCTION>{WSOrComment} { BEGIN MODE_PROCESSING_INSTRUCTION_CONTENT; /* continue lexing */ }
1019
1029
<MODE_PROCESSING_INSTRUCTION>"?>" { POP_STATE(); return token::PI_END; }
1020
1030
<MODE_PROCESSING_INSTRUCTION>{NCName} /* PITarget */ { TRY_SVAL_TOKEN (NCNAME_SVAL, put(yytext, yyleng), yytext); }
1113
1123
case INITIAL: return "INITIAL";
1124
case INITIAL_ACCUMULATOR: return "INITIAL_ACCUMULATOR";
1114
1125
case MODE_APOS_ATTRIBUTE_CONTENT: return "MODE_APOS_ATTRIBUTE_CONTENT";
1115
1126
case MODE_ELEM_COMP_CONSTR: return "MODE_ELEM_COMP_CONSTR";
1116
1127
case MODE_ATTR_COMP_CONSTR: return "MODE_ATTR_COMP_CONSTR";