1use std::cell::RefCell;
9use std::collections::HashMap;
10use std::fmt;
11use std::error::Error;
12use std::rc::Rc;
13
14use xmlerror::*;
15use xpath_impl::lexer::*;
16use xpath_impl::func;
17 #[derive(Debug, Hash, Eq, PartialEq, Clone)]
22pub enum XNodeType {
23 Nil,
24 OperatorPath,
25 AxisRoot,
26 AxisAncestor,
27 AxisAncestorOrSelf,
28 AxisAttribute,
29 AxisChild,
30 AxisDescendant,
31 AxisDescendantOrSelf,
32 AxisFollowing,
33 AxisFollowingSibling,
34 AxisNamespace,
35 AxisParent,
36 AxisPreceding,
37 AxisPrecedingSibling,
38 AxisSelf,
39 PredicateTop,
40 PredicateRevTop,
41 OperatorConcatenate,
42 OperatorOr,
43 OperatorAnd,
44 OperatorGeneralEQ,
45 OperatorGeneralNE,
46 OperatorGeneralLT,
47 OperatorGeneralGT,
48 OperatorGeneralLE,
49 OperatorGeneralGE,
50 OperatorValueEQ,
51 OperatorValueNE,
52 OperatorValueLT,
53 OperatorValueGT,
54 OperatorValueLE,
55 OperatorValueGE,
56 OperatorAdd,
57 OperatorSubtract,
58 OperatorUnaryPlus,
59 OperatorUnaryMinus,
60 OperatorMultiply,
61 OperatorDiv,
62 OperatorIDiv,
63 OperatorMod,
64 OperatorUnion,
65 OperatorIntersect,
66 OperatorExcept,
67 OperatorTo,
68 OperatorIsSameNode,
69 OperatorNodeBefore,
70 OperatorNodeAfter,
71 OperatorInstanceOf,
72 OperatorTreatAs,
73 OperatorCastableAs,
74 OperatorCastAs,
75 IfExpr,
76 IfThenElse,
77 ForExpr,
78 SomeExpr,
79 EveryExpr,
80 ForVarBind,
81 SomeVarBind,
82 EveryVarBind,
83 StringLiteral,
84 IntegerLiteral,
85 DecimalLiteral,
86 DoubleLiteral,
87 ContextItem,
88 FunctionCall,
89 ArgumentTop,
90 VarRef,
91 ApplyPredicate,
92 ApplyArgument,
93 KindTest,
94 DocumentTest,
95 ElementTest,
96 AttributeTest,
97 SchemaElementTest,
98 SchemaAttributeTest,
99 PITest,
100 CommentTest,
101 TextTest,
102 NamespaceNodeTest,
103 AnyKindTest,
104 KindTestTypeName,
105 EmptySequenceTest,
106 ItemTest,
107 TypeName,
108 AnyFunctionTest,
109 TypedFunctionTest,
110 MapTest,
111 ArrayTest,
112 AtomicOrUnionType,
113 ParenthesizedItemType,
114 SingleType,
115 SequenceType,
116 OperatorConcat,
117 OperatorMap,
118 LetExpr,
119 LetVarBind,
120 InlineFunction,
121 Param,
122 ReturnType,
123 ArgumentListTop,
124 NamedFunctionRef,
125 PartialFunctionCall,
126 ArgumentPlaceholder,
127 Map,
128 MapConstruct,
129 MapEntry,
130 SquareArray,
131 CurlyArray,
132 ArrayEntry,
133 UnaryLookupByExpr,
134 UnaryLookupByWildcard,
135 ParenthesizedExpr,
136}
137
138impl fmt::Display for XNodeType {
141 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
142 return write!(f, "{:?}", self);
143 }
144}
145
146#[derive(Eq, PartialEq, Clone)]
149pub struct XNodePtr {
150 xnode_ptr: Rc<RefCell<XNode>>,
151}
152
153#[derive(Eq, PartialEq, Clone)]
154struct XNode {
155 n_type: XNodeType,
156 name: String,
157 left: Option<XNodePtr>,
158 right: Option<XNodePtr>,
159}
160
161impl fmt::Debug for XNodePtr {
164 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
165 return write!(f, "{}", xnode_dump(self));
166 }
167}
168
169impl fmt::Display for XNodePtr {
172 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173 return write!(f, "{:?}", self);
174 }
175}
176
177fn xnode_dump(xnode: &XNodePtr) -> String {
180 return xnode_dump_sub(xnode, 0, 4, "T");
181}
182
183fn xnode_dump_sub(xnode: &XNodePtr, indent: usize, step: usize, pref: &str) -> String {
186 let mut buf: String = format!("{}{} [{}] {}\n",
187 &" ".repeat(indent),
188 pref,
189 get_xnode_type(xnode),
190 &get_xnode_name(&xnode));
191 let xl = get_left(xnode);
192 if ! is_nil_xnode(&xl) {
193 buf += &xnode_dump_sub(&xl, indent + step, step, "L");
194 }
195 let xr = get_right(xnode);
196 if ! is_nil_xnode(&xr) {
197 buf += &xnode_dump_sub(&xr, indent + step, step, "R");
198 }
199 return buf;
200}
201
202macro_rules! error_if_not_ttype {
210 ( $lex: expr, $ttype: expr, $msg: expr ) => {
211 if $lex.next_token().get_type() != $ttype {
212 return Err(xpath_syntax_error!($msg,
213 $lex.around_tokens().as_str()));
214 }
215 }
216}
217
218macro_rules! error_if_not_name {
226 ( $lex: expr, $name: expr, $msg: expr ) => {
227 if $lex.next_token().get_type() != TType::Name &&
228 $lex.next_token().get_name() != $name {
229 return Err(xpath_syntax_error!($msg,
230 $lex.around_tokens().as_str()));
231 }
232 }
233}
234
235macro_rules! return_nil_if_not_ttype {
239 ( $lex: expr, $ttype: expr ) => {
240 if $lex.next_token().get_type() != $ttype {
241 return Ok(new_nil_xnode());
242 }
243 }
244}
245
246macro_rules! return_if_non_nil {
251 ( $xnode: expr ) => {
252 if ! is_nil_xnode(&$xnode) {
253 return Ok($xnode);
254 }
255 }
256}
257
258macro_rules! return_if_nil {
263 ( $xnode: expr ) => {
264 if is_nil_xnode(&$xnode) {
265 return Ok($xnode);
266 }
267 }
268}
269
270macro_rules! error_if_nil {
274 ( $lex: expr, $xnode: expr, $msg: expr ) => {
275 if is_nil_xnode(&$xnode) {
276 return Err(xpath_syntax_error!($msg,
277 $lex.around_tokens().as_str()));
278 }
279 }
280}
281
282pub fn compile_xpath(xpath: &String) -> Result<XNodePtr, Box<Error>> {
286 let mut lex = Lexer::new(xpath)?;
287
288 return parse_main(&mut lex);
289}
290
291fn parse_main(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
295 let xnode = parse_expr(lex)?;
296
297 error_if_not_ttype!(lex, TType::EOF, "{}: 余分な字句が継続。");
298
299 return Ok(xnode);
300}
301
302fn parse_axis_step(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
333 let axis_tbl: HashMap<&str, XNodeType> = [
334 ( "ancestor", XNodeType::AxisAncestor ),
335 ( "ancestor-or-self", XNodeType::AxisAncestorOrSelf ),
336 ( "attribute", XNodeType::AxisAttribute ),
337 ( "child", XNodeType::AxisChild ),
338 ( "descendant", XNodeType::AxisDescendant ),
339 ( "descendant-or-self", XNodeType::AxisDescendantOrSelf ),
340 ( "following", XNodeType::AxisFollowing ),
341 ( "following-sibling", XNodeType::AxisFollowingSibling ),
342 ( "namespace", XNodeType::AxisNamespace ),
343 ( "parent", XNodeType::AxisParent ),
344 ( "preceding", XNodeType::AxisPreceding ),
345 ( "preceding-sibling", XNodeType::AxisPrecedingSibling ),
346 ( "self", XNodeType::AxisSelf ),
347 ].iter().cloned().collect();
348
349 let tok = lex.next_token();
350 match tok.get_type() {
351 TType::AxisName => {
352 lex.get_token();
353
354 error_if_not_ttype!(lex, TType::ColonColon, "{}: 軸名の次に :: が必要。");
355 lex.get_token();
357
358 let axis = match axis_tbl.get(tok.get_name()) {
359 Some(a) => a,
360 None => {
361 return Err(xpath_syntax_error!(
362 "{}: 軸名として不正。",
363 lex.around_tokens().as_str()));
364 },
365 };
366 if *axis == XNodeType::AxisNamespace {
367 return Err(uninplemented!(
368 "{}: namespace 軸は未実装。",
369 lex.around_tokens().as_str()));
370 }
371 return parse_node_test(lex, axis);
372 },
373 TType::At => { lex.get_token();
375 return parse_node_test(lex, &XNodeType::AxisAttribute);
376 },
377 TType::DotDot => {lex.get_token();
379 return Ok(new_xnode(XNodeType::AxisParent, "node()"));
380 },
381 _ => { return parse_node_test(lex, &XNodeType::AxisChild);
383 },
384 }
385}
386
387fn parse_node_test(lex: &mut Lexer, axis_type: &XNodeType) -> Result<XNodePtr, Box<Error>> {
392 let mut name = parse_wildcard(lex)?;
393 if name == "" {
394 name = parse_eqname(lex, "")?;
395 }
396
397 if name != "" { let axis_xnode = new_xnode(axis_type.clone(), name.as_str());
399 let predicates_xnode = parse_predicate_list(
400 lex, is_xnode_reverse_axis(&axis_type))?;
401 assign_as_right(&axis_xnode, &predicates_xnode);
402 return Ok(axis_xnode);
403 }
404
405 let kind_test_xnode = parse_kind_test(lex)?;
406 if ! is_nil_xnode(&kind_test_xnode) { let axis_xnode = new_xnode(axis_type.clone(), "");
408 assign_as_left(&axis_xnode, &kind_test_xnode);
409 let predicates_xnode = parse_predicate_list(
410 lex, is_xnode_reverse_axis(&axis_type))?;
411 assign_as_right(&axis_xnode, &predicates_xnode);
412 return Ok(axis_xnode);
413 }
414
415 return Ok(new_nil_xnode());
416}
417
418fn is_xnode_reverse_axis(n_type: &XNodeType) -> bool {
422 return [
423 XNodeType::AxisParent, XNodeType::AxisAncestor,
425 XNodeType::AxisAncestorOrSelf,
426 XNodeType::AxisPreceding,
427 XNodeType::AxisPrecedingSibling,
428 ].contains(n_type);
429}
430
431fn parse_kind_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
452
453 let mut xnode = parse_document_test(lex)?;
454 if is_nil_xnode(&xnode) {
455 xnode = parse_element_test(lex)?;
456 }
457 if is_nil_xnode(&xnode) {
458 xnode = parse_attribute_test(lex)?;
459 }
460 if is_nil_xnode(&xnode) {
461 xnode = parse_schema_element_test(lex)?;
462 }
463 if is_nil_xnode(&xnode) {
464 xnode = parse_schema_attribute_test(lex)?;
465 }
466 if is_nil_xnode(&xnode) {
467 xnode = parse_pi_test(lex)?;
468 }
469 if is_nil_xnode(&xnode) {
470 xnode = parse_comment_test(lex)?;
471 }
472 if is_nil_xnode(&xnode) {
473 xnode = parse_text_test(lex)?;
474 }
475 if is_nil_xnode(&xnode) {
476 xnode = parse_namespace_node_test(lex)?;
477 }
478 if is_nil_xnode(&xnode) {
479 xnode = parse_any_kind_test(lex)?;
480 }
481
482 if ! is_nil_xnode(&xnode) {
483 let kind_test_xnode = new_xnode(XNodeType::KindTest, "");
484 assign_as_left(&kind_test_xnode, &xnode);
485 return Ok(kind_test_xnode);
486 } else {
487 return Ok(new_nil_xnode());
488 }
489}
490
491fn parse_document_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
496 return_nil_if_not_ttype!(lex, TType::DocumentTest);
497 lex.get_token();
498 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
499 lex.get_token();
500
501 let mut s_xnode = parse_element_test(lex)?;
503 if is_nil_xnode(&s_xnode) {
504 s_xnode = parse_schema_element_test(lex)?;
505 }
506
507 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
508 lex.get_token();
509
510 let document_test_xnode = new_xnode(XNodeType::DocumentTest, "");
511 if ! is_nil_xnode(&s_xnode) {
512 assign_as_left(&document_test_xnode, &s_xnode);
513 }
514 return Ok(document_test_xnode);
515}
516
517fn parse_element_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
530 return_nil_if_not_ttype!(lex, TType::ElementTest);
531 lex.get_token();
532 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
533 lex.get_token();
534
535 let mut element_name_or_wildcard = parse_eqname(lex, "")?;
536 if element_name_or_wildcard.as_str() == "" {
537 if lex.next_token().get_type() == TType::Asterisk {
538 lex.get_token();
539 element_name_or_wildcard = String::from("*");
540 }
541 }
542
543 let mut type_name = String::from("xs:anyType?");
544 if element_name_or_wildcard.as_str() != "" {
545 if lex.next_token().get_type() == TType::Comma {
546 lex.get_token();
547 type_name = parse_eqname(lex, "xs")?;
548 if type_name == "" {
549 return Err(xpath_syntax_error!(
550 "{}: カンマの後に型名がない。",
551 lex.around_tokens().as_str()));
552 }
553 if lex.next_token().get_type() == TType::Question {
554 lex.get_token();
555 type_name += &"?";
556 }
557 }
558 }
559
560 if element_name_or_wildcard == "" {
561 element_name_or_wildcard = String::from("*");
562 }
563
564 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
565 lex.get_token();
566
567 let element_test_xnode = new_xnode(XNodeType::ElementTest, &element_name_or_wildcard);
568
569 let type_name_xnode = new_xnode(XNodeType::KindTestTypeName, &type_name);
570 assign_as_left(&element_test_xnode, &type_name_xnode);
571
572 return Ok(element_test_xnode);
573}
574
575fn parse_attribute_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
588 return_nil_if_not_ttype!(lex, TType::AttributeTest);
589 lex.get_token();
590 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
591 lex.get_token();
592
593 let mut attribute_name_or_wildcard = parse_eqname(lex, "")?;
594 if attribute_name_or_wildcard.as_str() == "" {
595 if lex.next_token().get_type() == TType::Asterisk {
596 lex.get_token();
597 attribute_name_or_wildcard = String::from("*");
598 }
599 }
600
601 let mut type_name = String::from("xs:anyType");
602 if attribute_name_or_wildcard.as_str() != "" {
603 if lex.next_token().get_type() == TType::Comma {
604 lex.get_token();
605 type_name = parse_eqname(lex, "xs")?;
606 if type_name == "" {
607 return Err(xpath_syntax_error!(
608 "{}: カンマの後に型名がない。",
609 lex.around_tokens().as_str()));
610 }
611 }
612 }
613
614 if attribute_name_or_wildcard == "" {
615 attribute_name_or_wildcard = String::from("*");
616 }
617
618 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
619 lex.get_token();
620
621 let attribute_test_xnode = new_xnode(XNodeType::AttributeTest, &attribute_name_or_wildcard);
622
623 let type_name_xnode = new_xnode(XNodeType::KindTestTypeName, &type_name);
624 assign_as_left(&attribute_test_xnode, &type_name_xnode);
625
626 return Ok(attribute_test_xnode);
627}
628
629fn parse_schema_element_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
636 return parse_kind_test_sub_one(lex,
637 TType::SchemaElementTest, XNodeType::SchemaElementTest);
638}
639
640fn parse_schema_attribute_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
647 return parse_kind_test_sub_one(lex,
648 TType::SchemaAttributeTest, XNodeType::SchemaAttributeTest);
649}
650
651fn parse_kind_test_sub_one(lex: &mut Lexer,
657 ttype: TType, xnode_type: XNodeType)
658 -> Result<XNodePtr, Box<Error>> {
659
660 return_nil_if_not_ttype!(lex, ttype);
661 lex.get_token();
662 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
663 lex.get_token();
664
665 let eqname = parse_eqname(lex, "")?;
666 if eqname == "" {
667 return Err(xpath_syntax_error!(
668 "{}: 名前が必要。",
669 lex.around_tokens().as_str()));
670 }
671
672 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
673 lex.get_token();
674
675 return Ok(new_xnode(xnode_type, &eqname));
676}
677
678fn parse_pi_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
682 return_nil_if_not_ttype!(lex, TType::PITest);
683 lex.get_token();
684 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
685 lex.get_token();
686
687 let tok = lex.next_token();
688 let mut arg = "";
689 match tok.get_type() {
690 TType::Name | TType::StringLiteral => {
691 lex.get_token();
692 arg = tok.get_name();
693 },
694 TType::RightParen => {},
695 _ => {
696 return Err(xpath_syntax_error!(
697 "{}: 名前または文字列が必要。",
698 lex.around_tokens().as_str()));
699 },
700 }
701
702 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
703 lex.get_token();
704
705 return Ok(new_xnode(XNodeType::PITest, arg));
706}
707
708fn parse_comment_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
712 return parse_kind_test_sub_none(lex,
713 TType::CommentTest, XNodeType::CommentTest);
714}
715
716fn parse_text_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
720 return parse_kind_test_sub_none(lex,
721 TType::TextTest, XNodeType::TextTest);
722}
723
724fn parse_namespace_node_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
729 return parse_kind_test_sub_none(lex,
730 TType::NamespaceNodeTest, XNodeType::NamespaceNodeTest);
731}
732
733fn parse_any_kind_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
737 return parse_kind_test_sub_none(lex,
738 TType::AnyKindTest, XNodeType::AnyKindTest);
739}
740
741fn parse_kind_test_sub_none(lex: &mut Lexer,
748 ttype: TType, xnode_type: XNodeType)
749 -> Result<XNodePtr, Box<Error>> {
750
751 return_nil_if_not_ttype!(lex, ttype);
752 lex.get_token();
753 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
754 lex.get_token();
755 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
756 lex.get_token();
757
758 return Ok(new_xnode(xnode_type, ""));
759}
760
761fn parse_predicate_list(lex: &mut Lexer, reverse_order: bool) -> Result<XNodePtr, Box<Error>> {
773 let xnode = parse_predicate(lex)?;
774 return_if_nil!(xnode);
775
776 let next_node = parse_predicate_list(lex, reverse_order)?;
777
778 let xnode_type = if ! reverse_order {
779 XNodeType::PredicateTop
780 } else {
781 XNodeType::PredicateRevTop
782 };
783
784 let xnode_pred = new_xnode(xnode_type, "Predicate");
785 assign_as_left(&xnode_pred, &xnode);
786 assign_as_right(&xnode_pred, &next_node);
787 return Ok(xnode_pred);
788}
789
790fn parse_predicate(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
794
795 return_nil_if_not_ttype!(lex, TType::LeftBracket);
796 lex.get_token();
797
798 let xnode = parse_expr(lex)?;
799
800 error_if_not_ttype!(lex, TType::RightBracket, "{}: 述語を閉じる「]」が必要。");
801 lex.get_token();
802
803 return Ok(xnode);
804}
805
806fn parse_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
820 let token_node_map: HashMap<TType, XNodeType> = [
821 ( TType::Comma, XNodeType::OperatorConcatenate ),
822 ].iter().cloned().collect();
823
824 return parse_bin_op_sub(lex, parse_expr_single, &token_node_map, false);
825}
826
827fn parse_expr_single(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
835 let xnode = parse_for_expr(lex)?;
836 return_if_non_nil!(xnode);
837
838 let xnode = parse_let_expr(lex)?;
839 return_if_non_nil!(xnode);
840
841 let xnode = parse_quantified_expr(lex)?;
842 return_if_non_nil!(xnode);
843
844 let xnode = parse_if_expr(lex)?;
845 return_if_non_nil!(xnode);
846
847 return parse_or_expr(lex);
848}
849
850fn parse_for_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
860 return_nil_if_not_ttype!(lex, TType::For);
861 lex.get_token();
862
863 let for_expr_xnode = new_xnode(XNodeType::ForExpr, "for");
864 let mut curr_xnode = for_expr_xnode.clone();
865 loop {
866 let var_bind_xnode = parse_simple_for_binding(lex)?;
867 if is_nil_xnode(&var_bind_xnode) {
868 break;
869 }
870 assign_as_right(&curr_xnode, &var_bind_xnode);
871 curr_xnode = get_right(&curr_xnode);
872
873 let tok = lex.next_token();
874 if tok.get_type() != TType::Comma {
875 break;
876 }
877 lex.get_token();
878 }
879
880 error_if_not_name!(lex, "return", "{}: for に対応する return が必要。");
881 lex.get_token();
882
883 let expr_single_xnode = parse_expr_single(lex)?;
884 assign_as_right(&curr_xnode, &expr_single_xnode);
885
886 return Ok(for_expr_xnode);
887}
888
889fn parse_simple_for_binding(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
899
900 return parse_simple_binding(lex, &XNodeType::ForVarBind);
901}
902
903fn parse_let_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
913 return_nil_if_not_ttype!(lex, TType::Let);
914 lex.get_token();
915
916 let let_expr_xnode = new_xnode(XNodeType::LetExpr, "let");
917 let mut curr_xnode = let_expr_xnode.clone();
918 loop {
919 let var_bind_xnode = parse_simple_let_binding(lex)?;
920 if is_nil_xnode(&var_bind_xnode) {
921 break;
922 }
923 assign_as_right(&curr_xnode, &var_bind_xnode);
924 curr_xnode = get_right(&curr_xnode);
925
926 let tok = lex.next_token();
927 if tok.get_type() != TType::Comma {
928 break;
929 }
930 lex.get_token();
931 }
932
933 error_if_not_name!(lex, "return", "{}: let に対応する return が必要。");
934 lex.get_token();
935
936 let expr_single_xnode = parse_expr_single(lex)?;
937 assign_as_right(&curr_xnode, &expr_single_xnode);
938
939 return Ok(let_expr_xnode);
940}
941
942fn parse_simple_let_binding(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
952
953 return_nil_if_not_ttype!(lex, TType::Dollar);
954 lex.get_token();
955
956 let var_name = parse_eqname(lex, "")?;
957 if var_name == "" {
958 return Err(xpath_syntax_error!(
959 "{}: $ の後には変数名が必要。",
960 lex.around_tokens().as_str()));
961 }
962
963 error_if_not_ttype!(lex, TType::Bind, "{}: 変数名の後に := が必要。");
964 lex.get_token();
965
966 let expr_single_xnode = parse_expr_single(lex)?;
967 let var_bind_xnode = new_xnode(XNodeType::LetVarBind, &var_name);
968 assign_as_left(&var_bind_xnode, &expr_single_xnode);
969
970 return Ok(var_bind_xnode);
971}
972
973fn parse_quantified_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
987 let quantified_expr_xnode;
988 let xnode_ttype;
989 let tok = lex.next_token();
990 match tok.get_type() {
991 TType::Some => {
992 lex.get_token();
993 quantified_expr_xnode = new_xnode(XNodeType::SomeExpr, "some");
994 xnode_ttype = XNodeType::SomeVarBind;
995 },
996 TType::Every => {
997 lex.get_token();
998 quantified_expr_xnode = new_xnode(XNodeType::EveryExpr, "every");
999 xnode_ttype = XNodeType::EveryVarBind;
1000 },
1001 _ => {
1002 return Ok(new_nil_xnode());
1003 },
1004 }
1005
1006 let mut curr_xnode = quantified_expr_xnode.clone();
1007 loop {
1008 let xnode_var_bind = parse_simple_binding(lex, &xnode_ttype)?;
1009 if is_nil_xnode(&xnode_var_bind) {
1010 break;
1011 }
1012 assign_as_right(&curr_xnode, &xnode_var_bind);
1013 curr_xnode = get_right(&curr_xnode);
1014
1015 let tok = lex.next_token();
1016 if tok.get_type() != TType::Comma {
1017 break;
1018 }
1019 lex.get_token();
1020 }
1021
1022 error_if_not_name!(lex, "satisfies", "{}: some/every に対応する satisfies が必要。");
1023 lex.get_token();
1024
1025 let expr_single_xnode = parse_expr_single(lex)?;
1026 assign_as_right(&curr_xnode, &expr_single_xnode);
1027
1028 return Ok(quantified_expr_xnode);
1029}
1030
1031fn parse_simple_binding(lex: &mut Lexer, xnode_type: &XNodeType) -> Result<XNodePtr, Box<Error>> {
1042
1043 return_nil_if_not_ttype!(lex, TType::Dollar);
1044 lex.get_token();
1045
1046 let var_name = parse_eqname(lex, "")?;
1047 if var_name == "" {
1048 return Err(xpath_syntax_error!(
1049 "{}: $ の後には変数名が必要。",
1050 lex.around_tokens().as_str()));
1051 }
1052
1053 error_if_not_name!(lex, "in", "{}: 変数名の後に in が必要。");
1054 lex.get_token();
1055
1056 let expr_single_xnode = parse_expr_single(lex)?;
1057 let var_bind_xnode = new_xnode(xnode_type.clone(), &var_name);
1058 assign_as_left(&var_bind_xnode, &expr_single_xnode);
1059
1060 return Ok(var_bind_xnode);
1061}
1062
1063fn parse_if_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1073
1074 return_nil_if_not_ttype!(lex, TType::If);
1075 lex.get_token();
1076
1077 error_if_not_ttype!(lex, TType::LeftParen, "{}: if 文には左括弧が必要。");
1078 lex.get_token();
1079
1080 let xnode_cond = parse_expr(lex)?;
1081 error_if_nil!(lex, xnode_cond, "{}: if文の条件式が不正。");
1082
1083 error_if_not_ttype!(lex, TType::RightParen, "{}: 条件式を閉じる右括弧が必要。");
1084 lex.get_token();
1085
1086 error_if_not_name!(lex, "then", "{}: if に対応する then が必要。");
1087 lex.get_token();
1088
1089 let xnode_then = parse_expr_single(lex)?;
1090 if is_nil_xnode(&xnode_then) {
1091 return Err(xpath_syntax_error!(
1092 "{}: if文のthen節が不正。", lex.around_tokens().as_str()));
1093 }
1094
1095 error_if_not_name!(lex, "else", "{}: if に対応する else が必要。");
1096 lex.get_token();
1097
1098 let xnode_else = parse_expr_single(lex)?;
1099 error_if_nil!(lex, xnode_else, "{}: if文のelse節が不正。");
1100
1101 let xnode_if_expr = new_xnode(XNodeType::IfExpr, "if_expr");
1102 let xnode_if_then_else = new_xnode(XNodeType::IfThenElse, "if_then_else");
1103
1104 assign_as_left(&xnode_if_expr, &xnode_cond);
1105 assign_as_right(&xnode_if_expr, &xnode_if_then_else);
1106 assign_as_left(&xnode_if_then_else, &xnode_then);
1107 assign_as_right(&xnode_if_then_else, &xnode_else);
1108
1109 return Ok(xnode_if_expr);
1110}
1111
1112fn parse_or_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1116 let token_node_map: HashMap<TType, XNodeType> = [
1117 ( TType::Or, XNodeType::OperatorOr ),
1118 ].iter().cloned().collect();
1119
1120 return parse_bin_op_sub(lex, parse_and_expr, &token_node_map, false);
1121}
1122
1123fn parse_and_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1127 let token_node_map: HashMap<TType, XNodeType> = [
1128 ( TType::And, XNodeType::OperatorAnd ),
1129 ].iter().cloned().collect();
1130
1131 return parse_bin_op_sub(lex, parse_comparison_expr, &token_node_map, false);
1132}
1133
1134fn parse_comparison_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1143 let token_node_map: HashMap<TType, XNodeType> = [
1144 ( TType::ValueEQ, XNodeType::OperatorValueEQ ),
1145 ( TType::ValueNE, XNodeType::OperatorValueNE ),
1146 ( TType::ValueLT, XNodeType::OperatorValueLT ),
1147 ( TType::ValueGT, XNodeType::OperatorValueGT ),
1148 ( TType::ValueLE, XNodeType::OperatorValueLE ),
1149 ( TType::ValueGE, XNodeType::OperatorValueGE ),
1150 ( TType::GeneralEQ, XNodeType::OperatorGeneralEQ ),
1151 ( TType::GeneralNE, XNodeType::OperatorGeneralNE ),
1152 ( TType::GeneralLT, XNodeType::OperatorGeneralLT ),
1153 ( TType::GeneralGT, XNodeType::OperatorGeneralGT ),
1154 ( TType::GeneralLE, XNodeType::OperatorGeneralLE ),
1155 ( TType::GeneralGE, XNodeType::OperatorGeneralGE ),
1156 ( TType::IsSameNode, XNodeType::OperatorIsSameNode ),
1157 ( TType::NodeBefore, XNodeType::OperatorNodeBefore ),
1158 ( TType::NodeAfter, XNodeType::OperatorNodeAfter ),
1159 ].iter().cloned().collect();
1160
1161 return parse_bin_op_sub(lex, parse_string_concat_expr, &token_node_map, true);
1162}
1163
1164fn parse_string_concat_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1168 let token_node_map: HashMap<TType, XNodeType> = [
1169 ( TType::OperatorConcat, XNodeType::OperatorConcat ),
1170 ].iter().cloned().collect();
1171
1172 return parse_bin_op_sub(lex, parse_range_expr, &token_node_map, false);
1173}
1174
1175fn parse_range_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1179 let token_node_map: HashMap<TType, XNodeType> = [
1180 ( TType::To, XNodeType::OperatorTo ),
1181 ].iter().cloned().collect();
1182
1183 return parse_bin_op_sub(lex, parse_additive_expr, &token_node_map, true);
1184}
1185
1186fn parse_additive_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1191 let token_node_map: HashMap<TType, XNodeType> = [
1192 ( TType::Plus, XNodeType::OperatorAdd ),
1193 ( TType::Minus, XNodeType::OperatorSubtract ),
1194 ].iter().cloned().collect();
1195
1196 return parse_bin_op_sub(lex, parse_multiplicative_expr, &token_node_map, false);
1197}
1198
1199fn parse_multiplicative_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1204 let token_node_map: HashMap<TType, XNodeType> = [
1205 ( TType::Asterisk, XNodeType::OperatorMultiply ),
1206 ( TType::Div, XNodeType::OperatorDiv ),
1207 ( TType::IDiv, XNodeType::OperatorIDiv ),
1208 ( TType::Mod, XNodeType::OperatorMod ),
1209 ].iter().cloned().collect();
1210
1211 return parse_bin_op_sub(lex, parse_union_expr, &token_node_map, false);
1212}
1213
1214fn parse_union_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1219 let token_node_map: HashMap<TType, XNodeType> = [
1220 ( TType::Union, XNodeType::OperatorUnion ),
1221 ].iter().cloned().collect();
1222
1223 let xnode = parse_bin_op_sub(lex, parse_intersect_except_expr, &token_node_map, false)?;
1224
1225 return Ok(xnode);
1226}
1227
1228fn parse_intersect_except_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1233 let token_node_map: HashMap<TType, XNodeType> = [
1234 ( TType::Intersect, XNodeType::OperatorIntersect ),
1235 ( TType::Except, XNodeType::OperatorExcept ),
1236 ].iter().cloned().collect();
1237
1238 return parse_bin_op_sub(lex, parse_instanceof_expr, &token_node_map, false);
1239}
1240
1241fn parse_instanceof_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1245 let xnode = parse_treat_expr(lex)?;
1246 let tok = lex.next_token();
1247 if tok.get_type() == TType::InstanceOf {
1248 lex.get_token();
1249 let seq_type_xnode = parse_sequence_type(lex)?;
1250 if is_nil_xnode(&seq_type_xnode) {
1251 return Err(xpath_syntax_error!(
1252 "{}: 「instance of」の後にはSequenceTypeが必要。",
1253 lex.around_tokens().as_str()));
1254 }
1255 let instance_of_xnode = new_xnode(XNodeType::OperatorInstanceOf, "");
1256 assign_as_left(&instance_of_xnode, &xnode);
1257 assign_as_right(&instance_of_xnode, &seq_type_xnode);
1258 return Ok(instance_of_xnode);
1259 }
1260
1261 return Ok(xnode);
1262}
1263
1264fn parse_treat_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1268 let xnode = parse_castable_expr(lex)?;
1269 let tok = lex.next_token();
1270 if tok.get_type() == TType::TreatAs {
1271 lex.get_token();
1272 let seq_type_xnode = parse_sequence_type(lex)?;
1273 if is_nil_xnode(&seq_type_xnode) {
1274 return Err(xpath_syntax_error!(
1275 "{}: 「treat of」の後にはSequenceTypeが必要。",
1276 lex.around_tokens().as_str()));
1277 }
1278 let treat_as_xnode = new_xnode(XNodeType::OperatorTreatAs, "");
1279 assign_as_left(&treat_as_xnode, &xnode);
1280 assign_as_right(&treat_as_xnode, &seq_type_xnode);
1281 return Ok(treat_as_xnode);
1282 }
1283
1284 return Ok(xnode);
1285}
1286
1287fn parse_sequence_type(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1299
1300 let xnode = parse_kind_test_sub_none(lex,
1301 TType::EmptySequence, XNodeType::EmptySequenceTest)?;
1302 if ! is_nil_xnode(&xnode) {
1303 let seq_type_xnode = new_xnode(XNodeType::SequenceType, "");
1304 assign_as_left(&seq_type_xnode, &xnode);
1305 return Ok(seq_type_xnode);
1306 }
1307
1308 let xnode = parse_item_type(lex)?;
1309 if ! is_nil_xnode(&xnode) {
1310 let tok = lex.next_token();
1311 let mut occurence_indicator = "";
1312 match tok.get_type() {
1313 TType::Question | TType::Asterisk | TType::Plus => {
1314 lex.get_token();
1315 occurence_indicator = tok.get_name();
1316 },
1317 _ => {},
1318 }
1319 let seq_type_xnode = new_xnode(
1320 XNodeType::SequenceType, occurence_indicator);
1321 assign_as_left(&seq_type_xnode, &xnode);
1322 return Ok(seq_type_xnode);
1323 }
1324
1325 return Ok(new_nil_xnode());
1326}
1327
1328fn parse_item_type(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1344 let xnode = parse_kind_test(lex)?;
1345 return_if_non_nil!(xnode);
1346
1347 let xnode = parse_kind_test_sub_none(lex, TType::Item, XNodeType::ItemTest)?;
1348 return_if_non_nil!(xnode);
1350
1351 let xnode = parse_function_test(lex)?;
1352 return_if_non_nil!(xnode);
1353
1354 let xnode = parse_map_test(lex)?;
1355 return_if_non_nil!(xnode);
1356
1357 let xnode = parse_array_test(lex)?;
1358 return_if_non_nil!(xnode);
1359
1360 let atomic_or_union_name = parse_eqname(lex, "xs")?;
1361 if atomic_or_union_name != "" {
1362 let xnode = new_xnode(XNodeType::AtomicOrUnionType, &atomic_or_union_name);
1363 return Ok(xnode);
1364 }
1365
1366 let xnode = parse_parenthesized_item_type(lex)?;
1367 return_if_non_nil!(xnode);
1368
1369 return Ok(new_nil_xnode());
1370}
1371
1372pub fn parse_function_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1387 return_nil_if_not_ttype!(lex, TType::Function);
1388 lex.get_token();
1389
1390 error_if_not_ttype!(lex, TType::LeftParen, "{}: function 文には左括弧が必要。");
1391 lex.get_token();
1392
1393 let tok = lex.next_token();
1394 if tok.get_type() == TType::Asterisk {
1395 lex.get_token();
1396 error_if_not_ttype!(lex, TType::RightParen, "{}: 引数リストを閉じる右括弧が必要。");
1397 lex.get_token();
1398 let xnode = new_xnode(XNodeType::AnyFunctionTest, "");
1399 return Ok(xnode);
1400 }
1401
1402 let sequence_type_list_xnode = parse_sequence_type_list(lex)?;
1403
1404 error_if_not_ttype!(lex, TType::RightParen, "{}: 引数リストを閉じる右括弧が必要。");
1405 lex.get_token();
1406
1407 error_if_not_name!(lex, "as", "{}: 戻り値型を表す as が必要。");
1408 lex.get_token();
1409
1410 let sequence_type_xnode = parse_sequence_type(lex)?;
1411 let return_type_xnode = new_xnode(XNodeType::ReturnType, "");
1412 assign_as_left(&return_type_xnode, &sequence_type_xnode);
1413 assign_as_right(&return_type_xnode, &sequence_type_list_xnode);
1414
1415 let xnode = new_xnode(XNodeType::TypedFunctionTest, "");
1416 assign_as_right(&xnode, &return_type_xnode);
1417 return Ok(xnode);
1418}
1419
1420fn parse_sequence_type_list(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1421 let sequence_type_xnode = parse_sequence_type(lex)?;
1422 return_if_nil!(sequence_type_xnode);
1423 let top_param_xnode = new_xnode(XNodeType::Param, "");
1424 assign_as_left(&top_param_xnode, &sequence_type_xnode);
1425
1426 let mut curr = top_param_xnode.clone();
1427 while lex.next_token().get_type() == TType::Comma {
1428 lex.get_token();
1429 let sequence_type_xnode = parse_sequence_type(lex)?;
1430 let param_xnode = new_xnode(XNodeType::Param, "");
1431 assign_as_left(¶m_xnode, &sequence_type_xnode);
1432 assign_as_right(&curr, ¶m_xnode);
1433 curr = param_xnode.clone();
1434 }
1435
1436 return Ok(top_param_xnode);
1437}
1438
1439fn parse_map_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1452 return_nil_if_not_ttype!(lex, TType::MapTest);
1453 lex.get_token();
1454 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
1455 lex.get_token();
1456
1457 let xnode = new_xnode(XNodeType::MapTest, "");
1458 let tok = lex.next_token();
1459 if tok.get_type() == TType::Asterisk {
1460 lex.get_token();
1461
1462 let any_atomic_xnode = new_xnode(XNodeType::AtomicOrUnionType, &"xs:anyAtomicType");
1463 assign_as_left(&xnode, &any_atomic_xnode);
1464
1465 let sequence_type_xnode = new_xnode(XNodeType::SequenceType, "*");
1466 assign_as_right(&xnode, &sequence_type_xnode);
1467 let item_test_xnode = new_xnode(XNodeType::ItemTest, "");
1468 assign_as_left(&sequence_type_xnode, &item_test_xnode);
1469 } else {
1470 let atomic_or_union_name = parse_eqname(lex, "xs")?;
1471 if atomic_or_union_name == "" {
1472 return Err(xpath_syntax_error!("{}: キーの型の指定がない。",
1473 lex.around_tokens().as_str()));
1474 }
1475
1476 let key_type_xnode = new_xnode(
1477 XNodeType::AtomicOrUnionType, &atomic_or_union_name);
1478 assign_as_left(&xnode, &key_type_xnode);
1479
1480 error_if_not_ttype!(lex, TType::Comma, "{}: 区切りのカンマが必要。");
1481 lex.get_token();
1482
1483 let sequence_type_xnode = parse_sequence_type(lex)?;
1484 assign_as_right(&xnode, &sequence_type_xnode);
1485
1486 }
1487
1488 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
1489 lex.get_token();
1490
1491 return Ok(xnode);
1492}
1493
1494fn parse_array_test(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1507 return_nil_if_not_ttype!(lex, TType::ArrayTest);
1508 lex.get_token();
1509 error_if_not_ttype!(lex, TType::LeftParen, "{}: 開き括弧が必要。");
1510 lex.get_token();
1511
1512 let xnode = new_xnode(XNodeType::ArrayTest, "");
1513 let tok = lex.next_token();
1514 if tok.get_type() == TType::Asterisk {
1515 lex.get_token();
1516 let sequence_type_xnode = new_xnode(XNodeType::SequenceType, "*");
1517 assign_as_left(&xnode, &sequence_type_xnode);
1518 let item_test_xnode = new_xnode(XNodeType::ItemTest, "");
1519 assign_as_left(&sequence_type_xnode, &item_test_xnode);
1520 } else {
1521 let sequence_type_xnode = parse_sequence_type(lex)?;
1522 assign_as_left(&xnode, &sequence_type_xnode);
1523 }
1524
1525 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
1526 lex.get_token();
1527
1528 return Ok(xnode);
1529}
1530
1531fn parse_parenthesized_item_type(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1535 return_nil_if_not_ttype!(lex, TType::LeftParen);
1536 lex.get_token();
1537
1538 let xnode = parse_item_type(lex)?;
1539
1540 error_if_not_ttype!(lex, TType::RightParen, "{}: 閉じ括弧が必要。");
1541 lex.get_token();
1542
1543 let paren_xnode = new_xnode(XNodeType::ParenthesizedItemType, "");
1544 assign_as_left(&paren_xnode, &xnode);
1545 return Ok(paren_xnode);
1546}
1547
1548fn parse_castable_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1557
1558 let xnode = parse_cast_expr(lex)?;
1559 let tok = lex.next_token();
1560 if tok.get_type() == TType::CastableAs {
1561 lex.get_token();
1562 let single_type_xnode = parse_single_type(lex)?;
1563 if is_nil_xnode(&single_type_xnode) {
1564 return Err(xpath_syntax_error!(
1565 "{}: キャストする型の名前が必要。",
1566 lex.around_tokens().as_str()));
1567 }
1568 let castable_xnode = new_xnode(XNodeType::OperatorCastableAs, "");
1569 assign_as_left(&castable_xnode, &xnode);
1570 assign_as_right(&castable_xnode, &single_type_xnode);
1571 return Ok(castable_xnode);
1572 }
1573
1574 return Ok(xnode);
1575}
1576
1577fn parse_cast_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1586
1587 let xnode = parse_arrow_expr(lex)?;
1588 let tok = lex.next_token();
1589 if tok.get_type() == TType::CastAs {
1590 lex.get_token();
1591 let single_type_xnode = parse_single_type(lex)?;
1592 if is_nil_xnode(&single_type_xnode) {
1593 return Err(xpath_syntax_error!(
1594 "{}: キャストする型の名前が必要。",
1595 lex.around_tokens().as_str()));
1596 }
1597 let cast_xnode = new_xnode(XNodeType::OperatorCastAs, "");
1598 assign_as_left(&cast_xnode, &xnode);
1599 assign_as_right(&cast_xnode, &single_type_xnode);
1600 return Ok(cast_xnode);
1601 }
1602
1603 return Ok(xnode);
1604}
1605
1606fn parse_single_type(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1612 let mut eqname = parse_eqname(lex, "")?;
1613 if eqname != "" {
1614 let tok = lex.next_token();
1615 if tok.get_type() == TType::Question {
1616 lex.get_token();
1617 eqname += tok.get_name();
1618 }
1619 let single_type_xnode = new_xnode(XNodeType::SingleType, "");
1620 let atomic_type_xnode = new_xnode(XNodeType::TypeName, &eqname);
1621 assign_as_left(&single_type_xnode, &atomic_type_xnode);
1622 return Ok(single_type_xnode);
1623 }
1624 return Ok(new_nil_xnode());
1625}
1626
1627fn parse_arrow_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1652
1653 let xnode = parse_unary_expr(lex)?;
1654 let mut curr_xnode = xnode.clone();
1655 while lex.next_token().get_type() == TType::Arrow {
1656 lex.get_token();
1657
1658 let func_name = parse_static_func_name(lex)?;
1659 if func_name != "" {
1660 let fcall_xnode = new_xnode(XNodeType::FunctionCall, &func_name);
1661 let arglist_xnode = parse_argument_list(lex)?;
1662 let arg_top_xnode = new_xnode(XNodeType::ArgumentTop, "");
1663 assign_as_left(&arg_top_xnode, &curr_xnode);
1664 assign_as_right(&arg_top_xnode, &arglist_xnode);
1665 assign_as_right(&fcall_xnode, &arg_top_xnode);
1666 curr_xnode = fcall_xnode.clone();
1667 continue;
1668 }
1669
1670 let varref_xnode = parse_varref(lex)?;
1671 if ! is_nil_xnode(&varref_xnode) {
1672 let apply_argment_xnode = new_xnode(XNodeType::ApplyArgument, "");
1673 assign_as_left(&apply_argment_xnode, &varref_xnode);
1674 let argument_top_xnode = new_xnode(XNodeType::ArgumentListTop, "");
1675 assign_as_right(&apply_argment_xnode, &argument_top_xnode);
1676
1677 let arglist_xnode = parse_argument_list(lex)?;
1678 let arg_top_xnode = new_xnode(XNodeType::ArgumentTop, "");
1679 assign_as_left(&arg_top_xnode, &curr_xnode);
1680 assign_as_right(&arg_top_xnode, &arglist_xnode);
1681 assign_as_left(&argument_top_xnode, &arg_top_xnode);
1682
1683 curr_xnode = apply_argment_xnode.clone();
1684 continue;
1685 }
1686
1687 return Err(xpath_syntax_error!(
1688 "{}: アロー演算子: 函数名が必要。",
1689 lex.around_tokens().as_str()));
1690 }
1691
1692 return Ok(curr_xnode.clone());
1693}
1694
1695fn parse_unary_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1699 let tok = lex.next_token();
1700 match tok.get_type() {
1701 TType::Minus => {
1702 lex.get_token();
1703 let next_node = parse_value_expr(lex)?;
1704 let xnode_op = new_xnode(XNodeType::OperatorUnaryMinus, "-");
1705 assign_as_right(&xnode_op, &next_node);
1706 return Ok(xnode_op);
1707 },
1708 TType::Plus => {
1709 lex.get_token();
1710 let next_node = parse_value_expr(lex)?;
1711 let xnode_op = new_xnode(XNodeType::OperatorUnaryPlus, "+");
1712 assign_as_right(&xnode_op, &next_node);
1713 return Ok(xnode_op);
1714 },
1715 _ => {
1716 return parse_value_expr(lex);
1717 }
1718 }
1719}
1720
1721fn parse_value_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1726 let token_node_map: HashMap<TType, XNodeType> = [
1727 ( TType::OperatorMap, XNodeType::OperatorMap ),
1728 ].iter().cloned().collect();
1729
1730 return parse_bin_op_sub(lex, parse_path_expr, &token_node_map, false);
1731}
1732
1733fn parse_bin_op_sub(lex: &mut Lexer,
1739 sub_parser: fn(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>>,
1740 token_node_map: &HashMap<TType, XNodeType>,
1741 op_once: bool) -> Result<XNodePtr, Box<Error>> {
1742
1743 let mut xnode = sub_parser(lex)?;
1744 loop {
1745 let tok = lex.next_token();
1746 let n_type = match token_node_map.get(&tok.get_type()) {
1747 Some(t) => t,
1748 None => break,
1749 };
1750 lex.get_token();
1751 let next_node = sub_parser(lex)?;
1752
1753 let xnode_op = new_xnode(n_type.clone(), tok.get_name());
1754 assign_as_left(&xnode_op, &xnode);
1755 assign_as_right(&xnode_op, &next_node);
1756 xnode = xnode_op;
1757 if op_once { break;
1759 }
1760 }
1761 return Ok(xnode);
1762}
1763
1764fn parse_path_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1780
1781 let tok = lex.next_token();
1782 match tok.get_type() {
1783 TType::Slash => {
1784 lex.get_token();
1785
1786 let op_path_xnode = new_xnode(XNodeType::OperatorPath, "parse_path_expr Slash");
1787 let root_xnode = new_xnode(XNodeType::AxisRoot, "node()");
1788 assign_as_left(&op_path_xnode, &root_xnode);
1789
1790 let rel_xnode = parse_relative_path_expr(lex)?;
1791 if ! is_nil_xnode(&rel_xnode) {
1792 assign_as_right(&op_path_xnode, &rel_xnode);
1793 }
1794 return Ok(op_path_xnode);
1795 },
1796
1797 TType::SlashSlash => {
1798 lex.get_token();
1799
1800 let op_path_xnode_u = new_xnode(XNodeType::OperatorPath, "parse_path_expr SlashSlash 1");
1801 let root_xnode = new_xnode(XNodeType::AxisRoot, "/");
1802 assign_as_left(&op_path_xnode_u, &root_xnode);
1803
1804 let op_path_xnode_l = new_xnode(XNodeType::OperatorPath, "parse_path_expr SlashSlash 2");
1805 let ds_xnode = new_xnode(XNodeType::AxisDescendantOrSelf, "node()");
1806 assign_as_right(&op_path_xnode_u, &op_path_xnode_l);
1807 assign_as_left(&op_path_xnode_l, &ds_xnode);
1808
1809 let rel_xnode = parse_relative_path_expr(lex)?;
1810 if ! is_nil_xnode(&rel_xnode) {
1811 assign_as_right(&op_path_xnode_l, &rel_xnode);
1812 }
1813 return Ok(op_path_xnode_u);
1814 },
1815 _ => {
1816 return parse_relative_path_expr(lex);
1817 },
1818 }
1819}
1820
1821fn parse_relative_path_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1835
1836 let step_expr_xnode = parse_step_expr(lex)?;
1837 if is_nil_xnode(&step_expr_xnode) {
1838 return Ok(new_nil_xnode());
1839 }
1840 let top_op_path_xnode = new_xnode(XNodeType::OperatorPath, "parse_relative_path_expr TOP");
1841 assign_as_left(&top_op_path_xnode, &step_expr_xnode);
1842 let mut curr_xnode = top_op_path_xnode.clone();
1843
1844 loop {
1845 let tok = lex.next_token();
1846 match tok.get_type() {
1847 TType::Slash => {
1848 lex.get_token();
1849 let step_expr_xnode = parse_step_expr(lex)?;
1850 let op_path_xnode = new_xnode(XNodeType::OperatorPath, "parse_relative_path_expr Slash");
1851 assign_as_left(&op_path_xnode, &step_expr_xnode);
1852 assign_as_right(&curr_xnode, &op_path_xnode);
1853 curr_xnode = op_path_xnode.clone();
1854 },
1855 TType::SlashSlash => {
1856 lex.get_token();
1857 let step_expr_xnode = parse_step_expr(lex)?;
1858
1859 let op_path_xnode_u = new_xnode(XNodeType::OperatorPath, "parse_relative_path_expr SlashSlash 1");
1860 let ds_xnode = new_xnode(XNodeType::AxisDescendantOrSelf, "node()");
1861 assign_as_left(&op_path_xnode_u, &ds_xnode);
1862
1863 let op_path_xnode_l = new_xnode(XNodeType::OperatorPath, "parse_relative_path_expr SlashSlash 2");
1864 assign_as_left(&op_path_xnode_l, &step_expr_xnode);
1865
1866 assign_as_right(&op_path_xnode_u, &op_path_xnode_l);
1867 assign_as_right(&curr_xnode, &op_path_xnode_u);
1868 curr_xnode = op_path_xnode_l.clone();
1869 },
1870 _ => {
1871 break;
1872 },
1873 }
1874 }
1875
1876 let right_of_top = get_right(&top_op_path_xnode);
1882 if is_nil_xnode(&right_of_top) {
1883 let left_of_top = get_left(&top_op_path_xnode);
1884 return Ok(left_of_top);
1885 } else {
1886 return Ok(top_op_path_xnode);
1887 }
1888}
1889
1890fn parse_step_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1894
1895 let xnode = parse_postfix_expr(lex)?;
1896 return_if_non_nil!(xnode);
1897
1898 return parse_axis_step(lex);
1899}
1900
1901fn parse_postfix_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1924 let primary_xnode = parse_primary_expr(lex)?;
1925 return_if_nil!(primary_xnode);
1926
1927 let mut curr_xnode = primary_xnode.clone();
1928 loop {
1929 let postfix_xnode = parse_postfix(lex)?;
1930 if is_nil_xnode(&postfix_xnode) {
1931 return Ok(curr_xnode);
1932 }
1933
1934 let apply_postfix_xnode = match get_xnode_type(&postfix_xnode) {
1935 XNodeType::PredicateTop => {
1936 new_xnode(XNodeType::ApplyPredicate, "")
1937 },
1938 XNodeType::ArgumentListTop => {
1939 new_xnode(XNodeType::ApplyArgument, "")
1940 },
1941 _ => {
1942 new_xnode(XNodeType::OperatorMap, "")
1943 },
1944 };
1945 assign_as_left(&apply_postfix_xnode, &curr_xnode);
1946 assign_as_right(&apply_postfix_xnode, &postfix_xnode);
1947 curr_xnode = apply_postfix_xnode.clone();
1948 }
1949}
1950
1951fn parse_postfix(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1957 match lex.next_token().get_type() {
1958 TType::LeftBracket => {
1959 let xnode = parse_predicate(lex)?;
1960 let predicate_top_xnode = new_xnode(XNodeType::PredicateTop, "");
1961 assign_as_left(&predicate_top_xnode, &xnode);
1962 return Ok(predicate_top_xnode);
1963 },
1964 TType::LeftParen => {
1965 let xnode = parse_argument_list(lex)?;
1966 let argument_top_xnode = new_xnode(XNodeType::ArgumentListTop, "");
1967 assign_as_left(&argument_top_xnode, &xnode);
1968 return Ok(argument_top_xnode);
1969 },
1970 TType::Question => {
1971 let xnode = parse_unary_lookup(lex)?;
1972 return Ok(xnode);
1973 },
1974 _ => {
1975 return Ok(new_nil_xnode());
1976 },
1977 }
1978}
1979
1980fn parse_primary_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
1992
1993 let xnode = parse_literal(lex)?;
1994 return_if_non_nil!(xnode);
1995
1996 let xnode = parse_varref(lex)?;
1997 return_if_non_nil!(xnode);
1998
1999 let xnode = parse_parenthesized_expr(lex)?;
2000 return_if_non_nil!(xnode);
2001
2002 let xnode = parse_context_item_expr(lex)?;
2003 return_if_non_nil!(xnode);
2004
2005 let xnode = parse_function_call(lex)?;
2006 return_if_non_nil!(xnode);
2007
2008 let xnode = parse_function_item_expr(lex)?;
2009 return_if_non_nil!(xnode);
2010
2011 let xnode = parse_map_constructor(lex)?;
2012 return_if_non_nil!(xnode);
2013
2014 let xnode = parse_array_constructor(lex)?;
2015 return_if_non_nil!(xnode);
2016
2017 let xnode = parse_unary_lookup(lex)?;
2018 return_if_non_nil!(xnode);
2019
2020 return Ok(new_nil_xnode());
2021}
2022
2023fn parse_literal(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2034 let tok = lex.next_token();
2035 match tok.get_type() {
2036 TType::StringLiteral => {
2037 lex.get_token();
2038 return Ok(new_xnode(XNodeType::StringLiteral, tok.get_name()));
2039 },
2040 TType::IntegerLiteral => {
2041 lex.get_token();
2042 return Ok(new_xnode(XNodeType::IntegerLiteral, tok.get_name()));
2043 },
2044 TType::DecimalLiteral => {
2045 lex.get_token();
2046 return Ok(new_xnode(XNodeType::DecimalLiteral, tok.get_name()));
2047 },
2048 TType::DoubleLiteral => {
2049 lex.get_token();
2050 return Ok(new_xnode(XNodeType::DoubleLiteral, tok.get_name()));
2051 },
2052 _ => {
2053 return Ok(new_nil_xnode());
2054 }
2055 }
2056}
2057
2058fn parse_varref(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2066 let tok = lex.next_token();
2067 match tok.get_type() {
2068 TType::Dollar => {
2069 lex.get_token();
2070
2071 let eqname = parse_eqname(lex, "")?;
2072 if eqname != "" {
2073 return Ok(new_xnode(XNodeType::VarRef, eqname.as_str()));
2074 } else {
2075 return Err(xpath_syntax_error!(
2076 "{}: 変数参照の $ に続いて名前が必要。",
2077 lex.around_tokens().as_str()));
2078 }
2079 },
2080 _ => {
2081 return Ok(new_nil_xnode());
2082 }
2083 }
2084}
2085
2086fn parse_parenthesized_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2094
2095 let tok = lex.next_token();
2096 match tok.get_type() {
2097 TType::LeftParen => {
2098 lex.get_token();
2099 let xnode = parse_expr(lex)?;
2100
2101 error_if_not_ttype!(lex, TType::RightParen,
2102 "{}: 左括弧に対応する右括弧が必要。");
2103 lex.get_token();
2104
2105 let parenthesized_expr_xnode =
2106 new_xnode(XNodeType::ParenthesizedExpr, "");
2107 assign_as_left(&parenthesized_expr_xnode, &xnode);
2108 return Ok(parenthesized_expr_xnode);
2109 },
2110 _ => {
2111 return Ok(new_nil_xnode());
2112 },
2113 }
2114}
2115
2116fn parse_context_item_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2123
2124 let tok = lex.next_token();
2125 match tok.get_type() {
2126 TType::Dot => {
2127 lex.get_token();
2128 return Ok(new_xnode(XNodeType::ContextItem, "."));
2129 },
2133 _ => {
2134 return Ok(new_nil_xnode());
2135 },
2136 }
2137}
2138
2139fn parse_function_item_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2144 let xnode = parse_named_function_ref(lex)?;
2145 return_if_non_nil!(xnode);
2146
2147 return parse_inline_function_expr(lex);
2148}
2149
2150fn parse_named_function_ref(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2154 lex.mark_token_index();
2155 let func_name = parse_static_func_name(lex)?;
2156 if func_name == "" { lex.restore_marked_index();
2158 return Ok(new_nil_xnode());
2159 }
2160
2161 let tok = lex.next_token();
2162 if tok.get_type() != TType::Sharp { lex.restore_marked_index();
2164 return Ok(new_nil_xnode());
2165 }
2166 lex.get_token();
2167
2168 let tok = lex.next_token();
2169 if tok.get_type() != TType::IntegerLiteral { lex.restore_marked_index();
2171 return Ok(new_nil_xnode());
2172 }
2173 let arity = tok.get_name();
2174 lex.get_token();
2175
2176 let xnode = new_xnode(XNodeType::NamedFunctionRef,
2177 &(func_name + &"#" + &arity));
2178 return Ok(xnode);
2179}
2180
2181fn parse_inline_function_expr(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2197 return_nil_if_not_ttype!(lex, TType::Function);
2198 lex.get_token();
2199
2200 error_if_not_ttype!(lex, TType::LeftParen, "{}: function 文には左括弧が必要。");
2201 lex.get_token();
2202
2203 let param_list_xnode = parse_param_list(lex)?;
2204
2205 error_if_not_ttype!(lex, TType::RightParen, "{}: 引数リストを閉じる右括弧が必要。");
2206 lex.get_token();
2207
2208 let return_type_xnode = new_xnode(XNodeType::ReturnType, "");
2209 let tok = lex.next_token();
2210 if tok.get_type() == TType::Name && tok.get_name() == "as" {
2211 lex.get_token();
2212 let xnode = parse_sequence_type(lex)?;
2213 assign_as_left(&return_type_xnode, &xnode);
2214 } else { assign_as_left(&return_type_xnode, &default_sequence_type());
2216 }
2217
2218 let function_body_xnode = parse_function_body(lex)?;
2219
2220 let inline_function_xnode = new_xnode(XNodeType::InlineFunction, "(inline function)");
2221 assign_as_left(&inline_function_xnode, &function_body_xnode);
2222 assign_as_right(&inline_function_xnode, &return_type_xnode);
2223 assign_as_right(&return_type_xnode, ¶m_list_xnode);
2224
2225 return Ok(inline_function_xnode);
2226}
2227
2228fn parse_param_list(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2232 let top_param_xnode = parse_param(lex)?;
2233 return_if_nil!(top_param_xnode);
2234
2235 let mut curr = top_param_xnode.clone();
2236 while lex.next_token().get_type() == TType::Comma {
2237 lex.get_token();
2238 let param_xnode = parse_param(lex)?;
2239 assign_as_right(&curr, ¶m_xnode);
2240 curr = param_xnode.clone();
2241 }
2242
2243 return Ok(top_param_xnode);
2244}
2245
2246fn parse_param(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2251 return_nil_if_not_ttype!(lex, TType::Dollar);
2252 lex.get_token();
2253
2254 let param_name = parse_eqname(lex, "")?;
2255 if param_name == "" {
2256 return Err(xpath_syntax_error!(
2257 "{}: 引数名が必要。", lex.around_tokens().as_str()));
2258 }
2259
2260 let tok = lex.next_token();
2261 if tok.get_type() == TType::Name && tok.get_name() == "as" {
2262 lex.get_token();
2263 let seq_type_xnode = parse_sequence_type(lex)?;
2264 let param_xnode = new_xnode(XNodeType::Param, ¶m_name);
2265 assign_as_left(¶m_xnode, &seq_type_xnode);
2266 return Ok(param_xnode);
2267 } else { let param_xnode = new_xnode(XNodeType::Param, ¶m_name);
2269 assign_as_left(¶m_xnode, &default_sequence_type());
2270 return Ok(param_xnode);
2271 }
2272}
2273
2274fn default_sequence_type() -> XNodePtr {
2278 let xnode = new_xnode(XNodeType::SequenceType, "*");
2279 let item_test_xnode = new_xnode(XNodeType::ItemTest, "");
2280 assign_as_left(&xnode, &item_test_xnode);
2281 return xnode;
2282}
2283
2284fn parse_function_body(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2289 error_if_not_ttype!(lex, TType::LeftCurly, "{}: 函数本体を始める左波括弧が必要。");
2290 lex.get_token();
2291
2292 let xnode = parse_expr(lex)?;
2293
2294 error_if_not_ttype!(lex, TType::RightCurly, "{}: 函数本体を閉じる右波括弧が必要。");
2295 lex.get_token();
2296
2297 return Ok(xnode);
2298}
2299
2300fn parse_map_constructor(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2315 return_nil_if_not_ttype!(lex, TType::Map);
2316 lex.get_token();
2317
2318 error_if_not_ttype!(lex, TType::LeftCurly, "{}: マップを開く左波括弧が必要。");
2319 lex.get_token();
2320
2321 let entries_xnode = parse_map_constructor_entries(lex)?;
2322
2323 error_if_not_ttype!(lex, TType::RightCurly, "{}: マップを閉じる右波括弧が必要。");
2324 lex.get_token();
2325
2326 let map_xnode = new_xnode(XNodeType::Map, "");
2327 assign_as_left(&map_xnode, &entries_xnode);
2328
2329 return Ok(map_xnode);
2330}
2331
2332fn parse_map_constructor_entries(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2337 let xnode = parse_map_constructor_entry(lex)?;
2338 return_if_nil!(xnode);
2339
2340 let top_xnode = new_xnode(XNodeType::MapConstruct, "");
2341 assign_as_left(&top_xnode, &xnode);
2342 let mut curr_xnode = top_xnode.clone();
2343
2344 while lex.next_token().get_type() == TType::Comma {
2345 lex.get_token();
2346 let entry_xnode = parse_map_constructor_entry(lex)?;
2347 let entry_list_xnode = new_xnode(XNodeType::MapConstruct, "");
2348 assign_as_left(&entry_list_xnode, &entry_xnode);
2349 assign_as_right(&curr_xnode, &entry_list_xnode);
2350 curr_xnode = entry_list_xnode.clone();
2351 }
2352 return Ok(top_xnode);
2353}
2354
2355fn parse_map_constructor_entry(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2365 let key_xnode = parse_expr_single(lex)?;
2366 return_if_nil!(key_xnode);
2367
2368 error_if_not_ttype!(lex, TType::Colon, "{}: MapConstructorのコロンが必要。");
2369 lex.get_token();
2370
2371 let value_xnode = parse_expr_single(lex)?;
2372 error_if_nil!(lex, value_xnode, "{}: マップの値を表す式が必要。");
2373
2374 let xnode = new_xnode(XNodeType::MapEntry, "");
2375 assign_as_left(&xnode, &key_xnode);
2376 assign_as_right(&xnode, &value_xnode);
2377 return Ok(xnode);
2378}
2379
2380fn parse_array_constructor(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2384 let xnode = parse_curly_array_constructor(lex)?;
2385 return_if_non_nil!(xnode);
2386
2387 let xnode = parse_square_array_constructor(lex)?;
2388 return_if_non_nil!(xnode);
2389
2390 return Ok(new_nil_xnode());
2391}
2392
2393fn parse_square_array_constructor(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2397 return_nil_if_not_ttype!(lex, TType::LeftBracket);
2398 lex.get_token();
2399
2400 let array_top_xnode = parse_expr_in_array(lex)?;
2401
2402 error_if_not_ttype!(lex, TType::RightBracket, "{}: 配列を閉じる右角括弧が必要。");
2403 lex.get_token();
2404
2405 let array_xnode = new_xnode(XNodeType::SquareArray, "");
2406 assign_as_left(&array_xnode, &array_top_xnode);
2407 return Ok(array_xnode);
2408}
2409
2410fn parse_curly_array_constructor(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2416 return_nil_if_not_ttype!(lex, TType::Array);
2417 lex.get_token();
2418
2419 error_if_not_ttype!(lex, TType::LeftCurly, "{}: 配列を開く左波括弧が必要。");
2420 lex.get_token();
2421
2422 let array_top_xnode = parse_expr(lex)?;
2423
2424 error_if_not_ttype!(lex, TType::RightCurly, "{}: 配列を閉じる右波括弧が必要。");
2425 lex.get_token();
2426
2427 let array_xnode = new_xnode(XNodeType::CurlyArray, "");
2428 assign_as_left(&array_xnode, &array_top_xnode);
2429 return Ok(array_xnode);
2430}
2431
2432fn parse_expr_in_array(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2441 let xnode = parse_expr_single(lex)?;
2442 return_if_nil!(xnode);
2443
2444 let top_xnode = new_xnode(XNodeType::ArrayEntry, "");
2445 assign_as_left(&top_xnode, &xnode);
2446 let mut curr_xnode = top_xnode.clone();
2447
2448 while lex.next_token().get_type() == TType::Comma {
2449 lex.get_token();
2450 let expr_xnode = parse_expr_single(lex)?;
2451 let entry_xnode = new_xnode(XNodeType::ArrayEntry, "");
2452 assign_as_left(&entry_xnode, &expr_xnode);
2453 assign_as_right(&curr_xnode, &entry_xnode);
2454 curr_xnode = entry_xnode.clone();
2455 }
2456 return Ok(top_xnode);
2457
2458}
2459
2460fn parse_unary_lookup(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2492 return_nil_if_not_ttype!(lex, TType::Question);
2493 lex.get_token();
2494
2495 let tok = lex.next_token();
2496 match tok.get_type() {
2497 TType::Name => {
2498 lex.get_token();
2499 let key = tok.get_name();
2500 let key_xnode = new_xnode(XNodeType::StringLiteral, key);
2501 let xnode = new_xnode(XNodeType::UnaryLookupByExpr, "");
2502 assign_as_left(&xnode, &key_xnode);
2503 return Ok(xnode);
2504 },
2505 TType::IntegerLiteral => {
2506 lex.get_token();
2507 let key = tok.get_name();
2508 let key_xnode = new_xnode(XNodeType::IntegerLiteral, key);
2509 let xnode = new_xnode(XNodeType::UnaryLookupByExpr, "");
2510 assign_as_left(&xnode, &key_xnode);
2511 return Ok(xnode);
2512 },
2513 TType::Asterisk => {
2514 lex.get_token();
2515 return Ok(new_xnode(XNodeType::UnaryLookupByWildcard, "*"));
2516 },
2517 TType::LeftParen => {
2518 let key_xnode = parse_parenthesized_expr(lex)?;
2519 let xnode = new_xnode(XNodeType::UnaryLookupByExpr, "");
2520 assign_as_left(&xnode, &key_xnode);
2521 return Ok(xnode);
2522 },
2523 _ => {
2524 lex.unget_token();
2525 return Ok(new_nil_xnode());
2526 },
2527 }
2528
2529}
2530
2531fn parse_function_call(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2546
2547 lex.mark_token_index();
2552 let func_name = parse_static_func_name(lex)?;
2553 if func_name == "" { lex.restore_marked_index();
2555 return Ok(new_nil_xnode());
2556 }
2557 let tok = lex.next_token();
2558 if tok.get_type() != TType::LeftParen { lex.restore_marked_index();
2560 return Ok(new_nil_xnode());
2561 }
2562
2563 let arg_node = parse_argument_list(lex)?; let mut arity: usize = 0;
2569 let mut is_partial_call = false;
2570 let mut curr = arg_node.clone();
2571 while ! is_nil_xnode(&curr) {
2572 if get_xnode_type(&curr) == XNodeType::ArgumentPlaceholder {
2573 is_partial_call = true;
2574 }
2575 arity += 1;
2576 curr = get_right(&curr);
2577 }
2578
2579 if func::check_function_spec(&func_name, arity) == false {
2583 return Err(xpath_syntax_error!(
2584 "{}: 函数が未実装、または引数の数 ({}) が不適切。",
2585 func_name, arity));
2586 }
2587
2588 let func_node = new_xnode(
2591 if is_partial_call {
2592 XNodeType::PartialFunctionCall
2593 } else {
2594 XNodeType::FunctionCall
2595 },
2596 &func_name);
2597 assign_as_right(&func_node, &arg_node);
2598
2599 return Ok(func_node);
2600}
2601
2602fn parse_argument_list(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2616
2617 error_if_not_ttype!(lex, TType::LeftParen, "{}: 引数並びの左括弧が必要。");
2618 lex.get_token();
2619
2620 let xnode = parse_argument_list_sub(lex)?;
2621
2622 error_if_not_ttype!(lex, TType::RightParen, "{}: 引数並びの右括弧が必要。");
2623 lex.get_token();
2624
2625 return Ok(xnode);
2626}
2627
2628fn parse_argument_list_sub(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2629 let xnode = parse_argument(lex)?;
2630 return_if_nil!(xnode);
2631
2632 let mut curr = xnode.clone();
2633 while lex.next_token().get_type() == TType::Comma {
2634 lex.get_token();
2635 let next_arg_xnode = parse_argument(lex)?;
2636 assign_as_right(&curr, &next_arg_xnode);
2637 curr = next_arg_xnode.clone();
2638 }
2639
2640 return Ok(xnode);
2641}
2642
2643fn parse_argument(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2649 let xnode = parse_expr_single(lex)?;
2650 if ! is_nil_xnode(&xnode) {
2651 let xnode_top = new_xnode(XNodeType::ArgumentTop, "");
2652 assign_as_left(&xnode_top, &xnode);
2653 return Ok(xnode_top);
2654 }
2655
2656 while lex.next_token().get_type() == TType::Question {
2657 lex.get_token();
2658 let xnode = new_xnode(XNodeType::ArgumentPlaceholder, "?");
2659 return Ok(xnode);
2660 }
2661
2662 return Ok(new_nil_xnode());
2663}
2664
2665fn parse_static_func_name(lex: &mut Lexer) -> Result<String, Box<Error>> {
2675 return parse_eqname(lex, "fn");
2676}
2677
2678fn parse_eqname(lex: &mut Lexer, default_prefix: &str) -> Result<String, Box<Error>> {
2687 let qname = parse_qname(lex, default_prefix)?;
2688 if qname != "" {
2689 return Ok(qname);
2690 }
2691
2692 let mut uri_qualified_name = String::new();
2693 match lex.next_token().get_type() {
2694 TType::BracedURILiteral => {
2695 uri_qualified_name += lex.get_token().get_name();
2696 match lex.next_token().get_type() {
2697 TType::Name => {
2698 uri_qualified_name += lex.get_token().get_name();
2699 return Ok(uri_qualified_name);
2700 },
2701 _ => {
2702 lex.unget_token();
2703 },
2704 }
2705 },
2706 _ => {},
2707 }
2708
2709 return Ok(String::new());
2710}
2711
2712fn parse_qname(lex: &mut Lexer, default_prefix: &str) -> Result<String, Box<Error>> {
2726 let tok = lex.next_token();
2727 if tok.get_type() != TType::Name {
2728 return Ok(String::new());
2729 }
2730
2731 let mut qname = String::from(tok.get_name());
2732 lex.get_token();
2733
2734 let tok = lex.next_token();
2735 if tok.get_type() != TType::Colon {
2736 if default_prefix != "" {
2737 return Ok(String::from(default_prefix) + &":" + &qname);
2738 } else {
2739 return Ok(qname);
2740 }
2741 }
2742 qname += tok.get_name(); lex.get_token();
2744
2745 error_if_not_ttype!(lex, TType::Name, "{}: QName: コロンの後には名前が必要。");
2746 let tok = lex.get_token();
2747 qname += tok.get_name();
2748
2749 return Ok(qname);
2750}
2751
2752fn parse_wildcard(lex: &mut Lexer) -> Result<String, Box<Error>> {
2762
2763 let mut qname = String::new();
2764
2765 match lex.next_token().get_type() {
2766 TType::Asterisk => {
2767 qname += lex.get_token().get_name();
2768 return Ok(qname);
2769 },
2770 TType::Name => {
2771 qname += lex.get_token().get_name();
2772 match lex.next_token().get_type() {
2773 TType::ColonAsterisk => {
2774 qname += lex.get_token().get_name();
2775 return Ok(qname);
2776 },
2777 _ => {
2778 lex.unget_token();
2779 },
2780 }
2781 },
2782 TType::AsteriskColon => {
2783 qname += lex.get_token().get_name();
2784 match lex.next_token().get_type() {
2785 TType::Name => {
2786 qname += lex.get_token().get_name();
2787 return Ok(qname);
2788 },
2789 _ => {
2790 lex.unget_token();
2791 },
2792 }
2793 },
2794 TType::BracedURILiteral => {
2795 qname += lex.get_token().get_name();
2796 match lex.next_token().get_type() {
2797 TType::Asterisk => {
2798 qname += lex.get_token().get_name();
2799 return Ok(qname);
2800 },
2801 _ => {
2802 lex.unget_token();
2803 },
2804 }
2805 },
2806 _ => {},
2807 }
2808 return Ok(String::new());
2809}
2810
2811fn new_xnode(n_type: XNodeType, name: &str) -> XNodePtr {
2818 return XNodePtr{
2819 xnode_ptr: Rc::new(RefCell::new(XNode{
2820 n_type: n_type,
2821 name: String::from(name),
2822 left: None,
2823 right: None,
2824 })),
2825 };
2826}
2827
2828fn new_nil_xnode() -> XNodePtr {
2831 return new_xnode(XNodeType::Nil, "");
2832}
2833
2834fn assign_as_left(parent: &XNodePtr, left: &XNodePtr) {
2837 if ! is_nil_xnode(left) {
2838 parent.xnode_ptr.borrow_mut().left =
2839 Some(XNodePtr{xnode_ptr: Rc::clone(&left.xnode_ptr)});
2840 }
2841}
2842
2843fn assign_as_right(parent: &XNodePtr, right: &XNodePtr) {
2846 if ! is_nil_xnode(right) {
2847 parent.xnode_ptr.borrow_mut().right =
2848 Some(XNodePtr{xnode_ptr: Rc::clone(&right.xnode_ptr)});
2849 }
2850}
2851
2852pub fn get_xnode_name(xnode: &XNodePtr) -> String {
2859 return xnode.xnode_ptr.borrow().name.clone();
2860}
2861
2862pub fn get_xnode_type(xnode: &XNodePtr) -> XNodeType {
2865 return xnode.xnode_ptr.borrow().n_type.clone();
2866}
2867
2868pub fn is_nil_xnode(xnode: &XNodePtr) -> bool {
2871 return xnode.xnode_ptr.borrow().n_type == XNodeType::Nil;
2872}
2873
2874pub fn get_left(parent: &XNodePtr) -> XNodePtr {
2877 match parent.xnode_ptr.borrow().left {
2878 Some(ref left) => {
2879 return XNodePtr{
2880 xnode_ptr: Rc::clone(&left.xnode_ptr),
2881 };
2882 },
2883 None => {
2884 return new_nil_xnode();
2885 },
2886 }
2887}
2888
2889pub fn get_right(parent: &XNodePtr) -> XNodePtr {
2892 match parent.xnode_ptr.borrow().right {
2893 Some(ref right) => {
2894 return XNodePtr{
2895 xnode_ptr: Rc::clone(&right.xnode_ptr),
2896 };
2897 },
2898 None => {
2899 return new_nil_xnode();
2900 },
2901 }
2902}
2903
2904#[cfg(test)]
2907mod test {
2908use xpath_impl::lexer::*;
2911 use xpath_impl::parser::compile_xpath;
2912
2913 #[test]
2916 fn test_parse() {
2917
2918 let xpath = r#" (1) instance of (xs:integer) "#;
2919
2920 match Lexer::new(&String::from(xpath)) {
2921 Ok(lex) => {
2922 println!("Tokens:\n{}", lex.token_dump());
2923 },
2924 Err(e) => {
2925 println!("Lexer Err: {}", e);
2926 },
2927 }
2928
2929 match compile_xpath(&String::from(xpath)) {
2930 Ok(xnode) => {
2931 println!("\n{}", xnode);
2932 },
2933 Err(e) => {
2934 println!("Err: {}", e);
2935 }
2936 }
2937}
2939}
2940