11 %token <XPath.Ast.axis> AXIS
13 %token SLASH SLASHSLASH COLONCOLON STAR PIPE
14 %token EQ NEQ LT GT LTE GTE OR AND ADD SUB DIV MOD
28 %type <XPath.Ast.path> xpath
37 path_rev { List.rev $1 }
41 simple_path { [ $1 ] }
42 | path_rev PIPE simple_path { $3 :: $1 }
47 absolute_path { Absolute (List.rev $1) }
48 | relative_path { Relative (List.rev $1) }
52 SLASH relative_path { $2 }
53 | SLASHSLASH relative_path { (DescendantOrSelf, node, []) :: $2 }
58 | relative_path SLASH step { $3 :: $1 }
59 | relative_path SLASHSLASH step { $3
60 :: (DescendantOrSelf, node, [])
65 axis_test pred_list { let a, b = $1 in a, b, $2 }
69 AXIS COLONCOLON test { $1, $3 }
72 let _ = Format.flush_str_formatter () in
73 let () = Format.fprintf Format.str_formatter "%a" XPath.Ast.print_axis $1 in
74 let a = Format.flush_str_formatter () in
75 Child, QNameSet.singleton (QName.of_string a)
83 | TAG { QNameSet.singleton(QName.of_string $1) }
87 pred_list_rev { List.rev $1 }
92 | pred_list LB expr RB { $3 :: $1 }
96 INT { Number(`Int($1)) }
97 | FLOAT { Number(`Float($1)) }
98 | STRING { String $1 }
99 | SUB expr %prec uminus { Unop(Neg, $2) }
100 | expr AND expr { Binop($1, And, $3) }
101 | expr OR expr { Binop($1, Or, $3) }
102 | expr ADD expr { Binop($1, Add, $3) }
103 | expr SUB expr { Binop($1, Sub, $3) }
104 | expr STAR expr { Binop($1, Mult, $3) }
105 | expr DIV expr { Binop($1, Div, $3) }
106 | expr MOD expr { Binop($1, Mod, $3) }
107 | expr EQ expr { Binop($1, Eq, $3) }
108 | expr NEQ expr { Binop($1, Neq, $3) }
109 | expr LT expr { Binop($1, Lt, $3) }
110 | expr LTE expr { Binop($1, Lte, $3) }
111 | expr GT expr { Binop($1, Gt, $3) }
112 | expr GTE expr { Binop($1, Gte, $3) }
113 | TAG LP arg_list RP { Fun_call(QName.of_string $1, $3) }
120 | arg_list1 { List.rev $1 }
125 | arg_list1 COMMA expr { $3 :: $1 }