📄 xpath_syntax.cpp
字号:
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_and)
{
v_inc_current (1);
if (! o_recognize (xpath_equality_expr, o_final))
return false;
if (o_final)
v_action (xpath_and_expr, xpath_and_expr_and);
}
else
if (o_final)
v_action (xpath_and_expr, xpath_and_expr_simple);
break;
case xpath_equality_expr :
//
// [23] EqualityExpr ::= RelationalExpr
// | EqualityExpr '=' RelationalExpr
// | EqualityExpr '!=' RelationalExpr
//
if (! o_recognize (xpath_relational_expr, o_final))
return false;
if (ltp_get (0))
{
switch (ltp_get (0) -> lex_get_value ())
{
case lex_equal :
v_inc_current (1);
if (! o_recognize (xpath_relational_expr, o_final))
return false;
if (o_final)
v_action (xpath_equality_expr, xpath_equality_expr_equal);
break;
case lex_not_equal :
v_inc_current (1);
if (! o_recognize (xpath_relational_expr, o_final))
return false;
if (o_final)
v_action (xpath_equality_expr, xpath_equality_expr_not_equal);
break;
default :
if (o_final)
v_action (xpath_equality_expr, xpath_equality_expr_simple);
break;
}
}
else
{
if (o_final)
v_action (xpath_equality_expr, xpath_equality_expr_simple);
}
break;
case xpath_relational_expr :
//
// [24] RelationalExpr ::= AdditiveExpr
// | RelationalExpr '<' AdditiveExpr
// | RelationalExpr '>' AdditiveExpr
// | RelationalExpr '<=' AdditiveExpr
// | RelationalExpr '>=' AdditiveExpr
//
if (! o_recognize (xpath_additive_expr, o_final))
return false;
if (ltp_get (0))
{
switch (ltp_get (0) -> lex_get_value ())
{
case lex_lt :
v_inc_current (1);
if (! o_recognize (xpath_additive_expr, o_final))
return false;
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_lt);
break;
case lex_gt :
v_inc_current (1);
if (! o_recognize (xpath_additive_expr, o_final))
return false;
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_gt);
break;
case lex_lt_equal :
v_inc_current (1);
if (! o_recognize (xpath_additive_expr, o_final))
return false;
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_lte);
break;
case lex_gt_equal :
v_inc_current (1);
if (! o_recognize (xpath_additive_expr, o_final))
return false;
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_gte);
break;
default :
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_simple);
break;
} // switch
}
else
if (o_final)
v_action (xpath_relational_expr, xpath_relational_expr_simple);
break;
case xpath_additive_expr :
//
// [25] AdditiveExpr ::= MultiplicativeExpr
// | AdditiveExpr '+' MultiplicativeExpr
// | AdditiveExpr '-' MultiplicativeExpr
//
if (! o_recognize (xpath_multiplicative_expr, o_final))
return false;
o_test_more = false;
if (ltp_get (0))
{
switch (ltp_get (0) -> lex_get_value ())
{
case lex_plus :
v_inc_current (1);
if (! o_recognize (xpath_multiplicative_expr, o_final))
return false;
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_plus);
o_test_more = true;
break;
case lex_minus :
v_inc_current (1);
if (! o_recognize (xpath_multiplicative_expr, o_final))
return false;
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_minus);
o_test_more = true;
break;
default :
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_simple);
break;
} // switch
}
else
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_simple);
if (o_test_more)
{
while (ltp_get (0) && (ltp_get (0) -> lex_get_value () == lex_plus || ltp_get (0) -> lex_get_value () == lex_minus))
{
if (ltp_get (0) -> lex_get_value () == lex_plus)
{
v_inc_current (1);
if (! o_recognize (xpath_multiplicative_expr, o_final))
return false;
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_more_plus);
}
else
{
v_inc_current (1);
if (! o_recognize (xpath_multiplicative_expr, o_final))
return false;
if (o_final)
v_action (xpath_additive_expr, xpath_additive_expr_more_minus);
}
}
}
break;
case xpath_multiplicative_expr :
//
// [26] MultiplicativeExpr ::= UnaryExpr
// | MultiplicativeExpr MultiplyOperator UnaryExpr
// | MultiplicativeExpr 'div' UnaryExpr
// | MultiplicativeExpr 'mod' UnaryExpr
//
if (! o_recognize (xpath_unary_expr, o_final))
return false;
if (ltp_get (0))
{
switch (ltp_get (0) -> lex_get_value ())
{
case lex_star :
//
// [34] MultiplyOperator ::= '*'
//
v_inc_current (1);
if (! o_recognize (xpath_unary_expr, o_final))
return false;
if (o_final)
v_action (xpath_multiplicative_expr, xpath_multiplicative_expr_star);
break;
case lex_div :
v_inc_current (1);
if (! o_recognize (xpath_unary_expr, o_final))
return false;
if (o_final)
v_action (xpath_multiplicative_expr, xpath_multiplicative_expr_div);
break;
case lex_mod :
v_inc_current (1);
if (! o_recognize (xpath_unary_expr, o_final))
return false;
if (o_final)
v_action (xpath_multiplicative_expr, xpath_multiplicative_expr_mod);
break;
default :
if (o_final)
v_action (xpath_multiplicative_expr, xpath_multiplicative_expr_simple);
break;
}
}
else
if (o_final)
v_action (xpath_multiplicative_expr, xpath_multiplicative_expr_simple);
break;
case xpath_unary_expr :
//
// [27] UnaryExpr ::= UnionExpr
// | '-' UnaryExpr
//
if (ltp_get (0) && ltp_get (0) -> lex_get_value () == lex_minus)
{
v_inc_current (1);
if (! o_recognize (xpath_unary_expr, o_final))
return false;
if (o_final)
v_action (xpath_unary_expr, xpath_unary_expr_minus);
}
else
{
if (! o_recognize (xpath_union_expr, o_final))
return false;
if (o_final)
v_action (xpath_unary_expr, xpath_unary_expr_simple);
}
break;
case xpath_variable_reference :
// [36] VariableReference ::= '$' QName
if (! ltp_get (0) || ! ltp_get (1))
return false;
if (ltp_get (0) -> lex_get_value () != lex_dollar)
return false;
v_inc_current (1);
if (! o_recognize (xpath_xml_q_name, o_final))
return false;
if (o_final)
v_action (xpath_variable_reference, 0);
break;
case xpath_name_test :
// [37] NameTest ::= '*'
// | NCName ':' '*'
// | QName
if (! ltp_get (0))
return false;
switch (ltp_get (0) -> lex_get_value ())
{
case lex_star :
v_inc_current (1);
if (o_final)
v_action (xpath_name_test, xpath_name_test_star);
break;
case lex_ncname :
o_qname = false;
if (ltp_get (1) && ltp_get (2) &&
ltp_get (1) -> lex_get_value () == lex_colon)
{
if (ltp_get (2) -> lex_get_value () == lex_star)
{
v_inc_current (3);
if (o_final)
v_action (xpath_name_test, xpath_name_test_ncname);
}
else
o_qname = true;
}
else
o_qname = true;
if (o_qname)
{
if (! o_recognize (xpath_xml_q_name, o_final))
return false;
if (o_final)
v_action (xpath_name_test, xpath_name_test_qname);
}
break;
}
break;
case xpath_xml_q_name :
// [Namespace XML : 6] QName ::= (Prefix ':')? LocalPart
// [Namespace XML : 7] Prefix ::= NCName
// [Namespace XML : 8] LocalPart ::= NCName
if (! ltp_get (0) || ltp_get (0) -> lex_get_value () != lex_ncname)
return false;
if (ltp_get (1) && ltp_get (1) -> lex_get_value () == lex_colon)
{
if (! ltp_get (2) || ltp_get (2) -> lex_get_value () != lex_ncname)
return false;
if (o_final)
{
v_action (xpath_xml_prefix, 0, 0, ltp_get (0) -> cp_get_literal ());
v_action (xpath_xml_local_part, 0, 0, ltp_get (2) -> cp_get_literal ());
v_action (xpath_xml_q_name, xpath_xml_q_name_colon);
}
v_inc_current (3);
}
else
{
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_final)
v_action (xpath_unknown, 0);
return false;
break;
}
return true;
} // v_recognize ()
} }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -