amxml/xpath_impl/
parser.rs

1//
2// xpath_impl/parser.rs
3//
4// amxml: XML processor with XPath.
5// Copyright (C) 2018 KOYAMA Hiro <tac@amris.co.jp>
6//
7
8use 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        // func::check_function_spec() を使う。
18
19// =====================================================================
20//
21#[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
138// =====================================================================
139//
140impl fmt::Display for XNodeType {
141    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
142        return write!(f, "{:?}", self);
143    }
144}
145
146// =====================================================================
147//
148#[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
161// =====================================================================
162//
163impl fmt::Debug for XNodePtr {
164    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
165        return write!(f, "{}", xnode_dump(self));
166    }
167}
168
169// =====================================================================
170//
171impl fmt::Display for XNodePtr {
172    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173        return write!(f, "{:?}", self);
174    }
175}
176
177// ---------------------------------------------------------------------
178//
179fn xnode_dump(xnode: &XNodePtr) -> String {
180    return xnode_dump_sub(xnode, 0, 4, "T");
181}
182
183// ---------------------------------------------------------------------
184//
185fn 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
202// =====================================================================
203// 構文解析用の補助マクロ。
204//
205
206// ---------------------------------------------------------------------
207// 次にトークン $ttype が現れることを確認し、そうでなければエラーとする。
208//
209macro_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
218// ---------------------------------------------------------------------
219// 次にトークン Name が現れ、その名前が $name であることを確認し、
220// そうでなければエラーとする。
221//      字句解析器ではキーワードか否か判断できないトークン
222//          then else in return satisfies as
223//      については、TType::Nameとして返される。
224//
225macro_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
235// ---------------------------------------------------------------------
236// 次にトークン $ttype が現れるかどうか調べ、そうでなければ nil を返す。
237//
238macro_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
246// ---------------------------------------------------------------------
247// nil でない xnode が得られた場合、その xnode を返す。
248//      「X ::= A | B」という選択型の構文規則のときに使う。
249//
250macro_rules! return_if_non_nil {
251    ( $xnode: expr ) => {
252        if ! is_nil_xnode(&$xnode) {
253            return Ok($xnode);
254        }
255    }
256}
257
258// ---------------------------------------------------------------------
259// nil でである xnode が得られた場合、そのまま nil を返す。
260//      「X ::= A*」という繰り返し型 (0個以上) の構文規則のときに使う。
261//
262macro_rules! return_if_nil {
263    ( $xnode: expr ) => {
264        if is_nil_xnode(&$xnode) {
265            return Ok($xnode);
266        }
267    }
268}
269
270// ---------------------------------------------------------------------
271// nil である xnode が得られた場合、エラーとする。
272//
273macro_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
282// =====================================================================
283// [PARSE]
284//
285pub 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
291// ---------------------------------------------------------------------
292// [  1] XPath ::= Expr
293//
294fn 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
302// ---------------------------------------------------------------------
303// [ 39] AxisStep ::= (ReverseStep | ForwardStep) PredicateList
304// [ 40] ForwardStep ::= (ForwardAxis NodeTest) | AbbrevForwardStep
305// [ 41] ForwardAxis ::= ("child" "::")
306//                     | ("descendant" "::")
307//                     | ("attribute" "::")
308//                     | ("self" "::")
309//                     | ("descendant-or-self" "::")
310//                     | ("following-sibling" "::")
311//                     | ("following" "::")
312//                     | ("namespace" "::")
313// [ 42] AbbrevForwardStep ::= "@"? NodeTest
314// [ 43] ReverseStep ::= (ReverseAxis NodeTest) | AbbrevReverseStep
315// [ 44] ReverseAxis ::= ("parent" "::")
316//                     | ("ancestor" "::")
317//                     | ("preceding-sibling" "::")
318//                     | ("preceding" "::")
319//                     | ("ancestor-or-self" "::")
320// [ 45] AbbrevReverseStep ::= ".."
321//
322//    AxisXXXX  --- (predicates)...
323//   (NameTest)
324//        |
325//    KindTest
326//
327// AxisXXXXにNameTestがある場合: XNode.nameに、照合する名前を設定する。
328//
329// AxisXXXXにKindTestがある場合: leftにXNode (n_type = KindTest) をつなげる。
330//
331//
332fn 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                    // 字句解析器が正しければ、ColonColonしか現れないはず。
356            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 => {  // 「@」は「attribute::」の省略形
374            lex.get_token();
375            return parse_node_test(lex, &XNodeType::AxisAttribute);
376        },
377        TType::DotDot => {// 「..」は「parent::node()」の省略形
378            lex.get_token();
379            return Ok(new_xnode(XNodeType::AxisParent, "node()"));
380        },
381        _ => {  // 「空」は「child::」の省略形
382            return parse_node_test(lex, &XNodeType::AxisChild);
383        },
384    }
385}
386
387// ---------------------------------------------------------------------
388// [ 46] NodeTest ::= KindTest | NameTest
389// [ 47] NameTest ::= EQName | Wildcard
390//
391fn 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 != "" {                             // NameTestがあった場合
398        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) {       // KindTestがあった場合
407        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
418// ---------------------------------------------------------------------
419// 逆順軸を表すノード型
420//
421fn is_xnode_reverse_axis(n_type: &XNodeType) -> bool {
422    return [
423        XNodeType::AxisParent,              // XPath 1.0 では正順
424        XNodeType::AxisAncestor,
425        XNodeType::AxisAncestorOrSelf,
426        XNodeType::AxisPreceding,
427        XNodeType::AxisPrecedingSibling,
428    ].contains(n_type);
429}
430
431// ---------------------------------------------------------------------
432// [ 83] KindTest ::= DocumentTest                                     ☆
433//                  | ElementTest
434//                  | AttributeTest
435//                  | SchemaElementTest                                ☆
436//                  | SchemaAttributeTest                              ☆
437//                  | PITest
438//                  | CommentTest
439//                  | TextTest
440//                  | NamespaceNodeTest                                ☆
441//                  | AnyKindTest
442//
443//
444//     KindTest        KindTest      KindTest    etc.
445//         |              |             |
446//    DocumentTest   ElementTest      PITest
447//         |        (element-name)    (arg)
448//         |              |
449//       .....          .....
450//
451fn 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
491// ---------------------------------------------------------------------
492// (当面、構文解析のみ)
493// [ 85] DocumentTest ::= "document-node" "(" (ElementTest | SchemaElementTest)? ")"
494//
495fn 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    // s_xnode: (ElementTest | SchemaElementTest)?
502    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
517// ---------------------------------------------------------------------
518// [ 94] ElementTest ::= "element" "(" (ElementNameOrWildcard ("," TypeName "?"?)?)? ")"
519// [ 95] ElementNameOrWildcard ::= ElementName | "*"
520// [ 99] ElementName ::= EQName
521// [101] TypeName ::= EQName
522//
523//     ElementTest
524// (element-name | "*")   <---- 既定値は "*"
525//          |
526//   KindTestTypeName
527//   (type-name "?"?)     <---- 既定値は "xs:anyType?"
528//
529fn 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
575// ---------------------------------------------------------------------
576// [ 90] AttributeTest ::= "attribute" "(" (AttribNameOrWildcard ("," TypeName)?)? ")"
577// [ 91] AttribNameOrWildcard ::= AttributeName | "*"
578// [ 98] AttributeName ::= EQName
579// [101] TypeName ::= EQName
580//
581//    AttributeTest
582// (attribute-name | "*")   <---- 既定値は "*"
583//          |
584//   KindTestTypeName
585//   (type-name "?"?)     <---- 既定値は "xs:anyType"
586//
587fn 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
629// ---------------------------------------------------------------------
630// (当面、構文解析のみ)
631// [ 96] SchemaElementTest ::= "schema-element" "(" ElementDeclaration ")"
632// [ 97] ElementDeclaration ::= ElementName
633// [ 99] ElementName ::= EQName
634//
635fn 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
640// ---------------------------------------------------------------------
641// (当面、構文解析のみ)
642// [ 92] SchemaAttributeTest ::= "schema-attribute" "(" AttributeDeclaration ")"
643// [ 93] AttributeDeclaration ::= AttributeName
644// [ 98] AttributeName ::= EQName
645//
646fn 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
651// ---------------------------------------------------------------------
652// SchemaElementTest | SchemaAttributeTest に共通:
653// テスト名 (ttype) の後に、"(" EQName ")" が続いているとき、
654// xnode (XNodeType: xnode_type) を生成して返す。
655//
656fn 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
678// ---------------------------------------------------------------------
679// [ 89] PITest ::= "processing-instruction" "(" (NCName | StringLiteral)? ")"
680//
681fn 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
708// ---------------------------------------------------------------------
709// [ 87] CommentTest ::= "comment" "(" ")"
710//
711fn 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
716// ---------------------------------------------------------------------
717// [ 86] TextTest ::= "text" "(" ")"
718//
719fn 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
724// ---------------------------------------------------------------------
725// (当面、構文解析のみ)
726// [ 88] NamespaceNodeTest ::= "namespace-node" "(" ")"
727//
728fn 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
733// ---------------------------------------------------------------------
734// [ 84] AnyKindTest ::= "node" "(" ")"
735//
736fn 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
741// ---------------------------------------------------------------------
742// AnyKindTest | TextTest | NamespaceNodeTest | CommentTest に共通。
743// また、SequenceTypeの「empty-sequence()」、ItemType の「item()」にも共通。
744// テスト名 (ttype) の後に、引数なしで "(" ")" が続いているとき、
745// xnode (XNodeType: xnode_type) を生成して返す。
746//
747fn 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
761// ---------------------------------------------------------------------
762// [ 51] PredicateList ::= Predicate*
763//
764// Predicate{Rev}Top --- Predicate{Rev}Top ---...
765//        |                     |
766//        |                   (Expr)
767//        |
768//      (Expr)
769//
770//          Predicateが0個の場合はNilを返す。
771//
772fn 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
790// ---------------------------------------------------------------------
791// [ 52] Predicate ::= "[" Expr "]"
792//
793fn 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
806// ---------------------------------------------------------------------
807// [  6] Expr ::= ExprSingle ( "," ExprSingle )*
808//
809//   OperatorConcatenate --- OperatorConcatenate --- nil
810//         |                       |
811//         |                    IfExpr ...
812//         |                      ...
813//     OperatorOr ...
814//        ...
815// 3.3.1 Constructing Sequences
816// Comma operator: evaluates each of its operands and concatenates
817// the resulting sequences, in order, into a single result sequence.
818//
819fn 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
827// ---------------------------------------------------------------------
828// [  7] ExprSingle ::= ForExpr
829//                    | LetExpr
830//                    | QuantifiedExpr
831//                    | IfExpr
832//                    | OrExpr
833//
834fn 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
850// ---------------------------------------------------------------------
851// [  8] ForExpr ::= SimpleForClause "return" ExprSingle
852// [  9] SimpleForClause ::= "for" SimpleForBinding ("," SimpleForBinding)*
853//
854//  ForExpr --- ForVarBind ------ ForVarBind --- ... --- (ExprSingle)
855//               (変数名)          (変数名)
856//                  |                 |
857//                 ... (ExprSingle)  ... (ExprSingle)
858// 
859fn 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
889// ---------------------------------------------------------------------
890// [ 10] SimpleForBinding ::= "$" VarName "in" ExprSingle
891// [ 60] VarName ::= EQName
892//
893//  ForVarBind
894//   (変数名)
895//      |
896//     ... (ExprSingle)
897//
898fn parse_simple_for_binding(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
899
900    return parse_simple_binding(lex, &XNodeType::ForVarBind);
901}
902
903// ---------------------------------------------------------------------
904// [ 11] LetExpr ::= SimpleLetClause "return" ExprSingle
905// [ 12] SimpleLetClause ::= "let" SimpleLetBinding ("," SimpleLetBinding)*
906//
907//  LetExpr --- LetVarBind ------ LetVarBind --- ... --- (ExprSingle)
908//               (変数名)          (変数名)
909//                  |                 |
910//                 ... (ExprSingle)  ... (ExprSingle)
911// 
912fn 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
942// ---------------------------------------------------------------------
943// [ 13] SimpleLetBinding ::= "$" VarName ":=" ExprSingle
944// [ 60] VarName ::= EQName
945//
946//  LetVarBind
947//   (変数名)
948//      |
949//     ... (ExprSingle)
950//
951fn 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
973// ---------------------------------------------------------------------
974// [ 14] QuantifiedExpr ::= ("some" | "every")
975//                  "$" VarName "in" ExprSingle
976//                      ("," "$" VarName "in" ExprSingle)*
977//                  "satisfies" ExprSingle
978//
979// 規格の記述は上のようになっているが、ForExprに準じて次のように考える。
980// [ 14a] QuantifiedExpr ::= SimpleQuantifiedClause "satisfies" ExprSingle
981// [ 14b] SimpleQuantifiedClause ::= ("some" | "every") 
982//                   SimpleQuantifiedBinding ("," SimpleQuantifiedBinding)*
983// [ 14c] SimpleQuantifiedBinding ::= "$" VarName "in" ExprSingle
984// [ 60] VarName ::= EQName
985//
986fn 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
1031// ---------------------------------------------------------------------
1032// [ 10] SimpleForBinding ::= "$" VarName "in" ExprSingle
1033// [ 60] VarName ::= EQName
1034// および、{Some,Every}Exprについて同様の構文。
1035//
1036// {For,Some,Every}VarBind
1037//         (変数名)
1038//            |
1039//           ... (ExprSingle)
1040//
1041fn 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
1063// ---------------------------------------------------------------------
1064// [ 15] IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle
1065//
1066//      IfExpr --- IfThenElse --- (xnode_else)
1067//         |            |
1068//         |        (xnode_then)
1069//         |
1070//    (xnode_cond)
1071//
1072fn 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
1112// ---------------------------------------------------------------------
1113// [ 16] OrExpr ::= AndExpr ( "or" AndExpr )*
1114//
1115fn 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
1123// ---------------------------------------------------------------------
1124// [ 17] AndExpr ::= ComparisonExpr ( "and" ComparisonExpr )*
1125//
1126fn 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
1134// ---------------------------------------------------------------------
1135// [ 18] ComparisonExpr ::= StringConcatExpr ( (ValueComp
1136//                           | GeneralComp
1137//                           | NodeComp) StringConcatExpr )?
1138// [ 33] ValueComp ::= "eq" | "ne" | "lt" | "le" | "gt" | "ge"
1139// [ 32] GenerapComp ::= "=" | "!=" | "<" | "<=" | ">" | ">="
1140// [ 34] NodeComp ::= "is" | "<<" | ">>"
1141//
1142fn 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
1164// ---------------------------------------------------------------------
1165// [ 19] StringConcatExpr ::= RangeExpr ( "||" RangeExpr )*
1166//
1167fn 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
1175// ---------------------------------------------------------------------
1176// [ 20] RangeExpr ::= AdditiveExpr ( "to" AdditiveExpr )?
1177//
1178fn 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
1186// ---------------------------------------------------------------------
1187// [ 21] AdditiveExpr ::= MultiplicativeExpr
1188//                         ( ( "+" | "-" ) MultiplicativeExpr )*
1189//
1190fn 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
1199// ---------------------------------------------------------------------
1200// [ 22] MultiplicativeExpr ::= UnionExpr
1201//                         ( ( "*" | "div" | "idiv" | "mod" ) UnionExpr )*
1202//
1203fn 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
1214// ---------------------------------------------------------------------
1215// [ 23] UnionExpr ::= IntersectExceptExpr
1216//                         ( ( "union" | "|" ) IntersectExceptExpr )*
1217//
1218fn 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
1228// ---------------------------------------------------------------------
1229// [ 24] IntersectExceptExpr ::= InstanceofExpr
1230//                         ( ( "intersect" | "except" ) InstanceofExpr )*
1231//
1232fn 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
1241// ---------------------------------------------------------------------
1242// [ 25] InstanceofExpr ::= TreatExpr ( ( "instance" "of" ) SequenceType )?
1243//
1244fn 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
1264// ---------------------------------------------------------------------
1265// [ 26] TreatExpr ::= CastableExpr ( ( "treat" "as" ) SequenceType )?
1266//
1267fn 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
1287// ---------------------------------------------------------------------
1288// [ 79] SequenceType ::= ("empty-sequence" "(" ")")
1289//                      | (ItemType OccurenceIndicator?)
1290// [ 80] OccurrenceIndicator ::= "?" | "*" | "+"
1291//
1292//   SequenceType            SequenceType         SequenceType
1293//        |                 (? | * | + | _)      (? | * | + | _)
1294//        |                       |                    |
1295// EmptySequenceTest          KindTest             AtomicOrUnionType
1296//                              .....                .....
1297//
1298fn 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
1328// ---------------------------------------------------------------------
1329// [ 81] ItemType ::= KindTest
1330//                  | ("item" "(" ")")
1331//                  | FunctionTest
1332//                  | MapTest
1333//                  | ArrayTest
1334//                  | AtomicOrUnionType
1335//                  | ParenthesizedItemType                            ☆
1336// [ 82] AtomicOrUnionType ::= EQName
1337//
1338//   KindTest             ItemTest         AtomicOrUnionType
1339//      |                                    (type)
1340//  DocumentTestなど
1341//    .....
1342//
1343fn 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                                    // item()
1349    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
1372// ---------------------------------------------------------------------
1373// [102] FunctionTest ::= AnyFunctionTest
1374//                      | TypedFunctionTest
1375// [103] AnyFunctionTest ::= "function" "(" "*" ")"
1376// [104] TypedFunctionTest ::= "function" "("
1377//                                (SequenceType ("," SequenceType)*)? ")"
1378//                                "as" SequenceType
1379//
1380//    AnyFunctionTest
1381//
1382//    TypedFunctionTest --- ReturnType ------ Param --------- Param --- ...
1383//                              |               |               |
1384//                         (SequenceType)  (SequenceType)  (SequenceType)
1385//
1386pub 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(&param_xnode, &sequence_type_xnode);
1432        assign_as_right(&curr, &param_xnode);
1433        curr = param_xnode.clone();
1434    }
1435
1436    return Ok(top_param_xnode);
1437}
1438
1439// ---------------------------------------------------------------------
1440// [105] MapTest ::= AnyMapTest | TypedMapTest
1441// [106] AnyMapTest ::= "map" "(" "*" ")"
1442//                  // map(xs:anyAtomicType, item()*) と同等。
1443// [107] TypedMapTest ::= "map" "(" AtomicOrUnionType "," SequenceType ")"
1444//
1445//     MapTest ------ SequenceType         MapTest ------- SequenceType
1446//        |                *                  |                ...
1447//        |                |                  |
1448// AtomicOrUnionType    ItemTest       AtomicOrUnionType
1449// (xs:anyAtomicType)                       (...)
1450//
1451fn 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
1494// ---------------------------------------------------------------------
1495// [108] ArrayTest ::= AnyArrayTest | TypedArrayTest
1496// [109] AnyArrayTest ::= "array" "(" "*" ")"
1497// [110] TypedArrayTest ::= "array" "(" SequenceType ")"
1498//
1499//  ArrayTest               ArrayTest
1500//      |                       |
1501// SequenceType            SequenceType
1502//      *                      ...
1503//      |
1504//   ItemTest
1505//
1506fn 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
1531// ---------------------------------------------------------------------
1532// [111] ParenthesizedItemType ::= "(" ItemType ")"
1533//
1534fn 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
1548// ---------------------------------------------------------------------
1549// [ 27] CastableExpr ::= CastExpr ( "castable" "as" ) SingleType )?
1550//
1551// OperatorCastableAs --- SingleType
1552//       |                   |
1553//   (CastExpr)           TypeName
1554//                         (type)
1555//
1556fn 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
1577// ---------------------------------------------------------------------
1578// [ 28] CastExpr ::= ArrowExpr ( ( "cast" "as" ) SingleType )?
1579//
1580// OperatorCastAs --- SingleType
1581//       |               |
1582//   (UnaryExpr)      TypeName
1583//                     (type)
1584//
1585fn 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
1606// ---------------------------------------------------------------------
1607// [ 77] SingleType ::= SimpleTypeName "?"?
1608// [100] SimpleTypeName ::= TypeName
1609// [101] TypeName ::= EQName
1610//
1611fn 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
1627// ---------------------------------------------------------------------
1628// [ 29] ArrowExpr ::= UnaryExpr ( "=>" ArrowFunctionSpecifier ArgumentList)*
1629// [ 55] ArrowFunctionSpecifier ::= EQName
1630//                                | VarRef
1631//                                | ParenthesizedExpr                  ☆
1632//
1633// UnaryExprを第1引数とすることを除き、FunctionCallと同じ構文木を生成する。
1634//
1635// (ArrowFunctionSpecifier ::= EQName の場合)
1636//
1637// FunctionCall --- ArgumentTop --- ArgumentTop --- ...
1638//   (函数名)           |               |    <ArgumentList相当の構文木>
1639//                      |              ...
1640//                      |
1641//                 (UnaryExpr)
1642//
1643// (ArrowFunctionSpecifier ::= VarRef の場合)
1644//
1645// ApplyArgument --- ArgumentListTop
1646//      |                 |
1647//    VarRef          ArgumentTop --- ArgumentTop --- ...
1648//   (変数名)             |               |    <ArgumentList相当の構文木>
1649//                    (UnaryExpr)        ...
1650//
1651fn 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
1695// ---------------------------------------------------------------------
1696// [ 23] UnaryExpr ::= ( "-" | "+" )? ValueExpr
1697//
1698fn 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
1721// ---------------------------------------------------------------------
1722// [ 31] ValueExpr ::= SimpleMapExpr
1723// [ 35] SimpleMapExpr ::= PathExpr ("!" PathExpr)*
1724//
1725fn 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
1733// ---------------------------------------------------------------------
1734// 二項演算子を解析
1735//    expr ::= subexpr (op subexpr)+ と考え、左結合になるように実装する。
1736//    op_once: trueならば「subexpr (op subexpr)?」として扱う (nonassoc)。
1737//
1738fn 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 {        // 1回だけでループから脱出する
1758            break;
1759        }
1760    }
1761    return Ok(xnode);
1762}
1763
1764// ---------------------------------------------------------------------
1765// [ 36] PathExpr ::= ("/" RelativePathExpr?)
1766//                  | ("//" RelativePathExpr)
1767//                  | RelativePathExpr
1768//
1769//  OpPath  --- ((RelativePathExpr))
1770//    |
1771// AxisRoot
1772//
1773//  OpPath --- OpPath --- ((RelativePathExpr))
1774//    |           |
1775//    |        AxisDescendantOrSelf
1776//    |
1777//  AxisRoot
1778//
1779fn 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
1821// ---------------------------------------------------------------------
1822// [ 37] RelativePathExpr ::= StepExpr (("/" | "//") StepExpr)*
1823//
1824//  OpPath --- OpPath --- OpPath --- OpPath --- x
1825//    |          |          |          |
1826//    |          |          |       AxisXXX --- (predicate)
1827//    |          |          |
1828//    |          |       AxisXXX --- (predicate)
1829//    |          |
1830//    |     AxisDescendantOrSelf
1831//    |
1832// AxisXXX --- (predicate)
1833//
1834fn 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    // -----------------------------------------------------------------
1877    // 最後にtop_op_path_xnode (最上位のxnode) を返す。
1878    // ただし、「(("/" | "//") StepExpr)*」部分が0個だった (rightがNil) 場合は
1879    // 冗長なので、top_op_path_xnodeの左辺ノードを返す。
1880    //
1881    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
1890// ---------------------------------------------------------------------
1891// [ 38] StepExpr ::= PostfixExpr | AxisStep
1892//
1893fn 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
1901// ---------------------------------------------------------------------
1902// [ 49] PostfixExpr ::= PrimaryExpr (Predicate | ArgumentList | Lookup)*
1903// これを次のように分解する。
1904// [ 49a] PostfixExpr ::= PrimaryExpr Postfix*
1905// [ 49b] Postfix ::= Predicate | ArgumentList | Lookup
1906//
1907//     [OperatorMap] -- (lookup)
1908//           |
1909//   [ApplyArgument] -- (argument_list)
1910//           |
1911//   [ApplyPredicate] -- (predicate)
1912//           |
1913//     (PrimaryExpr) --- (右辺値)...
1914//           |
1915//       (左辺値)...
1916//
1917// ただしPostfixListが空の場合はPrimaryExprをそのまま返す。
1918//
1919// (Postfix Lookup)
1920// KeySpacifierがNCName、IntegerLiteral、Wildcard ("*") の場合、
1921// E?S は、単項検索子を使った式 E ! ?S と同等。
1922//
1923fn 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
1951// ---------------------------------------------------------------------
1952// [ 49b] Postfix ::= Predicate
1953//                  | ArgumentList
1954//                  | Lookup
1955//
1956fn 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
1980// ---------------------------------------------------------------------
1981// [ 56] PrimaryExpr ::= Literal
1982//                     | VarRef
1983//                     | ParenthesizedExpr
1984//                     | ContextItemExpr
1985//                     | FunctionCall
1986//                     | FunctionItemExpr
1987//                     | MapConstructor
1988//                     | ArrayConstructor
1989//                     | UnaryLookup
1990//
1991fn 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
2023// ---------------------------------------------------------------------
2024// [ 57] Literal ::= NumericLiteral                -- [ 58] Lexer
2025//                 | StringLiteral                 -- [116] Lexer
2026// [ 58] NumericLiteral ::= IntegerLiteral
2027//                        | DecimalLiteral
2028//                        | DoubleLiteral
2029//
2030// {String,Integer,Decimal,Double}Literal
2031//        (リテラル値の文字列)
2032//
2033fn 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
2058// ---------------------------------------------------------------------
2059// [ 59] VarRef ::= "$" VarName
2060// [ 60] VarName ::= EQName
2061//
2062//      VarRef
2063// (変数名: EQName)
2064//
2065fn 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
2086// ---------------------------------------------------------------------
2087// [ 61] ParenthesizedExpr ::= "(" Expr? ")"
2088//
2089// ParenthesizedExpr
2090//         |
2091//       (expr)
2092//
2093fn 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
2116// ---------------------------------------------------------------------
2117// [ 62] ContextItemExpr ::= "."
2118//
2119//   ContextItem
2120//       (.)
2121//
2122fn 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                // XPath 1.0ではAxisSelfの意味であった。
2130                // 「(1 to 100) [. mod 5 eq 0]」のような文脈では原子値を表す。
2131                //
2132        },
2133        _ => {
2134            return Ok(new_nil_xnode());
2135        },
2136    }
2137}
2138
2139// ---------------------------------------------------------------------
2140// [ 66] FunctionItemExpr ::= NamedFunctionRef
2141//                          | InlineFunctionExpr
2142//
2143fn 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
2150// ---------------------------------------------------------------------
2151// [ 67] NamedFunctionRef ::= EQName "#" IntegerLiteral
2152//
2153fn 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 == "" {                            // 非該当
2157        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 {         // 非該当
2163        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 {         // 非該当
2170        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
2181// ---------------------------------------------------------------------
2182// [ 68] InlineFunctionExpr ::= "function" "(" ParamList? ")"
2183//                                  ("as" SequenceType)? FunctionBody
2184//
2185// 「"as" SequenceType」省略時は「item()*」
2186//
2187// InlineFunction --- ReturnType ------- Param ------- Param ---...
2188//       |                |            (varname)     (varname)
2189//       |                |                |             |
2190//       |          (SequenceType)   (SequenceType)(SequenceType)
2191//       |
2192//     Expr (FunctionBody) ---...
2193//       |
2194//      ...
2195//
2196fn 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 {        // 型の省略時は「item()*」
2215        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, &param_list_xnode);
2224
2225    return Ok(inline_function_xnode);
2226}
2227
2228// ---------------------------------------------------------------------
2229// [  2] ParamList ::= Param ("," Param)*
2230//
2231fn 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, &param_xnode);
2240        curr = param_xnode.clone();
2241    }
2242
2243    return Ok(top_param_xnode);
2244}
2245
2246// ---------------------------------------------------------------------
2247// [  3] Param ::= "$" EQName TypeDeclaration?
2248// [ 78] TypeDeclaration ::= "as" SequenceType
2249//
2250fn 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, &param_name);
2265        assign_as_left(&param_xnode, &seq_type_xnode);
2266        return Ok(param_xnode);
2267    } else {        // 型の省略時は「item()*」
2268        let param_xnode = new_xnode(XNodeType::Param, &param_name);
2269        assign_as_left(&param_xnode, &default_sequence_type());
2270        return Ok(param_xnode);
2271    }
2272}
2273
2274// ---------------------------------------------------------------------
2275// 「item()*」に相当するSequenceType。
2276//
2277fn 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
2284// ---------------------------------------------------------------------
2285// [  4] FunctionBody ::= EnclosedExpr
2286// [  5] EnclosedExpr ::= "{" Expr? "}"
2287//
2288fn 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
2300// ---------------------------------------------------------------------
2301// [ 69] MapConstructor ::= "map" "{" (MapConstructorEntry ("," MapConstructorEntry)*)? "}"
2302// これを次のように分解する。
2303// [ 69a] MapConstructor ::= "map" "{" MapConstructorEntries? "}"
2304// [ 69b] MapConstructorEntries ::=
2305//                     MapConstructorEntry ("," MapConstructorEntry)*
2306//       Map
2307//        |
2308//   MapConstruct ------- MapConstruct ------- MapConstruct
2309//        |                    |                    |
2310//     MepEntry -- (value)  MapEntry -- (value)  MapEntry -- (value)
2311//        |                    |                    |
2312//      (key)                (key)                (key)
2313//
2314fn 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
2332// ---------------------------------------------------------------------
2333// [ 69b] MapConstructorEntries ::=
2334//                     MapConstructorEntry ("," MapConstructorEntry)*
2335//
2336fn 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
2355// ---------------------------------------------------------------------
2356// [ 70] MapConstructorEntry ::= MapKeyExpr ":" MapValueExpr
2357// [ 71] MapKeyExpr ::= ExprSingle
2358// [ 72] MapValueExpr ::= ExprSingle
2359//
2360//  MapEntry --- (value)
2361//     |
2362//   (key)
2363//
2364fn 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
2380// ---------------------------------------------------------------------
2381// [ 73] ArrayConstructor ::= SquareArrayConstructor | CurlyArrayConstructor
2382//
2383fn 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
2393// ---------------------------------------------------------------------
2394// [ 74] SquareArrayConstructor ::= "[" (ExprSingle ("," ExprSingle)*)? "]"
2395//
2396fn 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
2410// ---------------------------------------------------------------------
2411// [ 75] CurlyArrayConstructor ::= "array" EnclosedExpr
2412// [  5] EnclosedExpr ::= "{" Expr? "}"
2413// [  6] Expr ::= ExprSingle ( "," ExprSingle )*
2414//
2415fn 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
2432// ---------------------------------------------------------------------
2433// [  5] EnclosedExpr ::= "{" Expr? "}"
2434// [  6] Expr ::= ExprSingle ( "," ExprSingle )*
2435//
2436//  ArrayEntry --- ArrayEntry --- ArrayEntry ---...
2437//      |              |              |
2438//    (expr)         (expr)         (expr)
2439//
2440fn 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
2460// ---------------------------------------------------------------------
2461// [ 53] Lookup ::= "?" KeySpecifier
2462// この部分はUnaryLookupの構文解析を援用する。
2463//
2464// ---------------------------------------------------------------------
2465// [ 76] UnaryLookup ::= "?" KeySpecifier
2466// [ 54] KeySpecifier ::= NCName
2467//                      | IntegerLiteral
2468//                      | ParenthesizedExpr
2469//                      | "*"
2470//
2471// NCNameの場合: 「.(KS)」と同等。例えば「?name」は「.("name")」と同等。
2472//      ContextItemはマップまたは配列。そうでなければtype error。
2473//
2474//    UnaryLookupByExpr
2475//           |
2476//      LiteralString
2477//        (nc_name)
2478//
2479// IntegerLiteralの場合: 「.(KS)」と同等。例えば「?3」は「.(3)」と同等。
2480//
2481//    UnaryLookupByExpr
2482//           |
2483//      LiteralInteger
2484//        (int_value)
2485//
2486// Wildcard ("*") の場合:
2487//    for $k in map:keys(.) return .($k)
2488//    for $k in 1 to array:size(.) return .($k)
2489// と同等。
2490//
2491fn 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
2531// ---------------------------------------------------------------------
2532// [ 63] FunctionCall ::= EQName ArgumentList
2533//
2534// FuncCall -- ArgTop -- ArgTop -- ... -- Nil
2535//               |         |
2536//               |      OpLiteral
2537//               |
2538//              OpEQ  -- (rhs)
2539//               |
2540//              (lhs)
2541//
2542// 引数並びの順に、ArgumentTopを右に連結。
2543// ArgumentTopの左に、引数を表すExprを連結。
2544//
2545fn parse_function_call(lex: &mut Lexer) -> Result<XNodePtr, Box<Error>> {
2546
2547    // -------------------------------------------------------------
2548    // 左括弧まで先読みして、函数名か否か判定する。
2549    // func_nameは、必要ならば "fn:" を補った形になっている。
2550    //
2551    lex.mark_token_index();
2552    let func_name = parse_static_func_name(lex)?;
2553    if func_name == "" {                            // 非該当
2554        lex.restore_marked_index();
2555        return Ok(new_nil_xnode());
2556    }
2557    let tok = lex.next_token();
2558    if tok.get_type() != TType::LeftParen {         // 非該当
2559        lex.restore_marked_index();
2560        return Ok(new_nil_xnode());
2561    }
2562
2563    let arg_node = parse_argument_list(lex)?;       // 引数が0個ならばNil
2564
2565    // -------------------------------------------------------------
2566    // 引数の数を調べる。
2567    //
2568    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    // -------------------------------------------------------------
2580    // この時点で函数表と照合して、函数の存在や引数の数を検査する。
2581    //
2582    if func::check_function_spec(&func_name, arity) == false {
2583        return Err(xpath_syntax_error!(
2584            "{}: 函数が未実装、または引数の数 ({}) が不適切。",
2585            func_name, arity));
2586    }
2587
2588    // -------------------------------------------------------------
2589    //
2590    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
2602// ---------------------------------------------------------------------
2603// [ 50] ArgumentList ::= "(" (Argument ("," Argument)*)? ")"
2604//
2605//  ArgTop -- ArgTop --...
2606//    |         |
2607//    |      OpLiteral
2608//    |
2609//   OpEQ  -- (rhs)
2610//    |
2611//  (lhs)
2612//              ただし引数が0個の場合はNilを返す。
2613//              ArgTopの代わりに、ArgumentPlaceholderになっていることもある。
2614//
2615fn 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
2643// ---------------------------------------------------------------------
2644// [ 64] Argument ::= ExprSingle
2645//                  | ArgumentPlaceholder
2646// [ 65] ArgumentPlaceholder ::= "?"
2647//
2648fn 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
2665// =====================================================================
2666// 構文解析器の補助
2667//
2668
2669// ---------------------------------------------------------------------
2670// 函数名 (EQName) と解析できる字句があれば、その文字列を返す。
2671// ただし、UnprefixedNameである場合、"fn:" を補う。
2672// 該当する字句がなければ空文字列を返す。
2673//
2674fn parse_static_func_name(lex: &mut Lexer) -> Result<String, Box<Error>> {
2675    return parse_eqname(lex, "fn");
2676}
2677
2678// ---------------------------------------------------------------------
2679// EQNameと解析できる字句があれば、その文字列を返す。
2680// 該当する字句がなければ空文字列を返す。
2681// [112] EQName ::= QName
2682//                | URIQualifiedName
2683// [117] URIQualifiedName ::= BracedURILiteral NCName
2684// [118] BracedURILiteral ::= "Q" "{" [^{}]* "}"
2685//
2686fn 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
2712// ---------------------------------------------------------------------
2713// (Lexerの) 現在位置以降にQNameと解析できる字句があれば、その文字列を返す。
2714// 該当する字句がなければ、当初の位置に戻した上で、空文字列を返す。
2715//
2716// QName ::= PrefixedName | UnprefixedName
2717// PrefixedName ::= Prefix ':' LocalPart
2718// UnprefixedName ::= LocalPart
2719// Prefix ::= NCName
2720// LocalPart ::= NCName
2721//
2722// default_prefix: "" でなければ、UnprefixedNameであった場合に、
2723//                 これをprefixとして補う。
2724//
2725fn 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();        // ":"
2743    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
2752// ---------------------------------------------------------------------
2753// Wildcardと解析できる字句があれば、その文字列を返す。
2754// 該当する字句がなければ空文字列を返す。
2755// [ 48] Wildcard ::= "*"
2756//                  | (NCName ":*")
2757//                  | ("*:" NCName)
2758//                  | (BracedURILiteral "*")
2759// [118] BracedURILiteral ::= "Q" "{" [^{}]* "}"
2760//
2761fn 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
2811// =====================================================================
2812// xnode関係の補助函数 (書き替えを伴うもの; 非公開)
2813//
2814
2815// ---------------------------------------------------------------------
2816//
2817fn 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
2828// ---------------------------------------------------------------------
2829//
2830fn new_nil_xnode() -> XNodePtr {
2831    return new_xnode(XNodeType::Nil, "");
2832}
2833
2834// ---------------------------------------------------------------------
2835//
2836fn 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
2843// ---------------------------------------------------------------------
2844//
2845fn 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
2852// =====================================================================
2853// xnode関係の補助函数 (参照のみおこなうもの; 公開)
2854//
2855
2856// ---------------------------------------------------------------------
2857//
2858pub fn get_xnode_name(xnode: &XNodePtr) -> String {
2859    return xnode.xnode_ptr.borrow().name.clone();
2860}
2861
2862// ---------------------------------------------------------------------
2863//
2864pub fn get_xnode_type(xnode: &XNodePtr) -> XNodeType {
2865    return xnode.xnode_ptr.borrow().n_type.clone();
2866}
2867
2868// ---------------------------------------------------------------------
2869//
2870pub fn is_nil_xnode(xnode: &XNodePtr) -> bool {
2871    return xnode.xnode_ptr.borrow().n_type == XNodeType::Nil;
2872}
2873
2874// ---------------------------------------------------------------------
2875//
2876pub 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
2889// ---------------------------------------------------------------------
2890//
2891pub 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// =====================================================================
2905//
2906#[cfg(test)]
2907mod test {
2908//    use super::*;
2909
2910    use xpath_impl::lexer::*;
2911    use xpath_impl::parser::compile_xpath;
2912
2913    // -----------------------------------------------------------------
2914    //
2915    #[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//        assert_eq!("A", "Z");
2938    }
2939}
2940