📄 xpath_syntax.cpp
字号:
break;
default :
if (! o_recognize (xpath_name_test, o_final))
return false;
if (o_final)
v_action (xpath_node_test, xpath_node_test_name_test);
}
break;
case xpath_predicate :
// [8] Predicate ::= '[' PredicateExpr ']'
if (! ltp_get (1))
return false;
if (ltp_get (0) -> lex_get_value () != lex_obrack)
return false;
v_inc_current (1);
if (! o_recognize (xpath_predicate_expr, o_final))
return false;
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_cbrack)
return false;
v_inc_current (1);
if (o_final)
v_action (xpath_predicate, 0);
break;
case xpath_predicate_expr :
// [9] PredicateExpr ::= Expr
if (! o_recognize (xpath_expr, o_final))
return false;
if (o_final)
v_action (xpath_predicate_expr, 0);
break;
case xpath_abbreviated_absolute_location_path :
// [10] AbbreviatedAbsoluteLocationPath ::= '//' RelativeLocationPath
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_2_slash)
return false;
v_inc_current (1);
if (! o_recognize (xpath_relative_location_path, o_final))
return false;
if (o_final)
v_action (xpath_abbreviated_absolute_location_path, 0);
break;
// Note : [11] is processed by [3]
case xpath_abbrieviated_step :
// [12] AbbreviatedStep ::= '.' | '..'
if (! ltp_get (0))
return false;
switch (ltp_get (0) -> lex_get_value ())
{
case lex_dot :
v_inc_current (1);
if (o_final)
v_action (xpath_abbrieviated_step, 0);
break;
case lex_2_dot :
v_inc_current (1);
if (o_final)
v_action (xpath_abbrieviated_step, 1);
break;
default :
return false;
}
break;
// Note : [13] processed by [5]
case xpath_expr :
//
// [14] Expr ::= OrExpr
//
if (! ltp_get (0))
return false;
if (! o_recognize (xpath_or_expr, o_final))
return false;
if (o_final)
v_action (xpath_expr, 0);
break;
case xpath_primary_expr :
// [15] PrimaryExpr ::= VariableReference
// | '(' Expr ')'
// | Literal
// | Number
// | FunctionCall
if (! ltp_get (0))
return false;
switch (ltp_get (0) -> lex_get_value ())
{
case lex_dollar :
if (! o_recognize (xpath_variable_reference, o_final))
return false;
if (o_final)
v_action (xpath_primary_expr, xpath_primary_expr_variable);
break;
case lex_oparen :
v_inc_current (1);
if (! o_recognize (xpath_expr, o_final))
return false;
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_cparen)
return false;
v_inc_current (1);
if (o_final)
v_action (xpath_primary_expr, xpath_primary_expr_paren_expr);
break;
case lex_literal :
if (o_final)
v_action (xpath_primary_expr, xpath_primary_expr_literal, 0, ltp_get (0) -> cp_get_literal ());
v_inc_current (1);
break;
case lex_number :
if (o_final)
v_action (xpath_primary_expr, xpath_primary_expr_number, 0, ltp_get (0) -> cp_get_literal ());
v_inc_current (1);
break;
default :
if (! o_recognize (xpath_function_call, o_final))
return false;
if (o_final)
v_action (xpath_primary_expr, xpath_primary_expr_function_call);
break;
}
break;
case xpath_function_call :
// [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument )* )? ')'
// [35] FunctionName ::= QName - node_type
if (! ltp_get (0))
return false;
switch (ltp_get (0) -> lex_get_value ())
{
case lex_comment :
case lex_text :
case lex_node :
case lex_processing_instruction :
if (o_final)
{
v_action (xpath_xml_local_part, 0, 0, ltp_get (0) -> cp_get_literal ());
v_action (xpath_xml_q_name, xpath_xml_q_name_simple);
}
v_inc_current (1);
break;
default :
if (! o_recognize (xpath_xml_q_name, o_final))
return false;
}
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_oparen)
return false;
v_inc_current (1);
if (! ltp_get (0))
return false;
if (ltp_get (0) -> lex_get_value () == lex_cparen)
{
v_inc_current (1);
if (o_final)
v_action (xpath_function_call, 0);
}
else
{
ltp_freeze = ltp_get (0);
o_found = true;
u_nb_argument = 0;
while (o_found)
{
if (u_nb_argument)
{
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_comma)
o_found = false;
else
v_inc_current (1);
}
if (o_found)
{
if (! o_recognize (xpath_argument, o_final))
o_found = false;
else
{
u_nb_argument++;
ltp_freeze = ltp_get (0);
}
}
}
v_set_current (ltp_freeze);
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_cparen)
return false;
v_inc_current (1);
if (o_final)
v_action (xpath_function_call, 1, u_nb_argument);
}
break;
case xpath_argument :
// [17] Argument ::= Expr
if (! o_recognize (xpath_expr, o_final))
return false;
if (o_final)
v_action (xpath_argument, 0);
break;
case xpath_union_expr :
//
// [18] UnionExpr ::= PathExpr
// | UnionExpr '|' PathExpr
//
if (! o_recognize (xpath_path_expr, o_final))
return false;
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_orchar)
{
v_inc_current (1);
if (! o_recognize (xpath_union_expr, o_final))
return false;
if (o_final)
v_action (xpath_union_expr, xpath_union_expr_union);
}
else
if (o_final)
v_action (xpath_union_expr, xpath_union_expr_simple);
break;
case xpath_path_expr :
//
// [19] PathExpr ::= LocationPath
// | FilterExpr
// | FilterExpr '/' RelativeLocationPath
// | FilterExpr '//' RelativeLocationPath
//
ltp_freeze = ltp_get (0);
o_location_path = false;
if (! o_recognize (xpath_filter_expr, false))
o_location_path = true;
else
{
v_set_current (ltp_freeze);
o_recognize (xpath_filter_expr, o_final);
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_slash)
{
v_inc_current (1);
if (! o_recognize (xpath_relative_location_path, o_final))
o_location_path = true;
else
if (o_final)
v_action (xpath_path_expr, xpath_path_expr_slash);
}
else
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_2_slash)
{
v_inc_current (1);
if (! o_recognize (xpath_relative_location_path, o_final))
o_location_path = true;
else
if (o_final)
v_action (xpath_path_expr, xpath_path_expr_2_slash);
}
else
{
if (o_final)
v_action (xpath_path_expr, xpath_path_expr_filter);
}
}
if (o_location_path)
{
v_set_current (ltp_freeze);
if (! o_recognize (xpath_location_path, o_final))
return false;
if (o_final)
v_action (xpath_path_expr, xpath_path_expr_location_path);
}
break;
case xpath_filter_expr :
//
// [20] FilterExpr ::= PrimaryExpr
// | FilterExpr Predicate
//
if (! o_recognize (xpath_primary_expr, o_final))
return false;
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_obrack)
{
if (! o_recognize (xpath_predicate, o_final))
return false;
if (o_final)
v_action (xpath_filter_expr, xpath_filter_expr_predicate);
}
else
if (o_final)
v_action (xpath_filter_expr, xpath_filter_expr_primary);
break;
case xpath_or_expr :
//
// [21] OrExpr ::= AndExpr
// | OrExpr 'or' AndExpr
//
o_test_more = false;
if (! o_recognize (xpath_and_expr, o_final))
return false;
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_or)
{
v_inc_current (1);
if (! o_recognize (xpath_and_expr, o_final))
return false;
if (o_final)
v_action (xpath_or_expr, xpath_or_expr_or);
o_test_more = true;
}
else
if (o_final)
v_action (xpath_or_expr, xpath_or_expr_simple);
if (o_test_more)
{
while (ltp_get (0) && (ltp_get (0) ->lex_get_value () == lex_or ))
{
v_inc_current (1);
if (! o_recognize (xpath_and_expr, o_final))
return false;
if (o_final)
v_action (xpath_or_expr, xpath_or_expr_more);
}
}
break;
case xpath_and_expr :
//
// [22] AndExpr ::= EqualityExpr
// | AndExpr 'and' EqualityExpr
//
if (! o_recognize (xpath_equality_expr, o_final))
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -