📄 xpath_processor.cpp
字号:
break;
}
break;
case xpath_and_expr :
switch (u_sub)
{
case xpath_and_expr_simple :
v_execute_one (xpath_equality_expr, o_skip_only);
break;
case xpath_and_expr_and :
o_error = false;
erpp_arg = NULL;
try
{
v_execute_one (xpath_equality_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_equality_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
v_function_and (erpp_arg);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (4);
break;
}
break;
case xpath_equality_expr :
switch (u_sub)
{
case xpath_equality_expr_simple :
v_execute_one (xpath_relational_expr, o_skip_only);
break;
case xpath_equality_expr_equal :
case xpath_equality_expr_not_equal :
o_error = false;
erpp_arg = NULL;
try
{
v_execute_one (xpath_relational_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_relational_expr, o_skip_only); // this is buggy. should be xpath_equality_expr
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
if (u_sub == xpath_equality_expr_equal)
v_function_equal (erpp_arg);
else
v_function_not_equal (erpp_arg);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (5);
break;
}
break;
case xpath_relational_expr :
switch (u_sub)
{
case xpath_relational_expr_simple :
v_execute_one (xpath_additive_expr, o_skip_only);
break;
case xpath_relational_expr_lt :
case xpath_relational_expr_gt :
case xpath_relational_expr_lte :
case xpath_relational_expr_gte :
o_error = false;
erpp_arg = NULL;
try
{
v_execute_one (xpath_additive_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_additive_expr, o_skip_only); // this is buggy. should be xpath_equality_expr
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
v_function_relational (erpp_arg, u_sub);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (6);
break;
default :
assert (false);
}
break;
case xpath_additive_expr :
switch (u_sub)
{
case xpath_additive_expr_simple :
v_execute_one (xpath_multiplicative_expr, o_skip_only);
break;
case xpath_additive_expr_plus :
case xpath_additive_expr_minus :
try
{
o_error = false;
erpp_arg = NULL;
v_execute_one (xpath_multiplicative_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_multiplicative_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
if (u_sub == xpath_additive_expr_plus)
v_function_plus (erpp_arg);
else
v_function_minus (erpp_arg);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (7);
break;
case xpath_additive_expr_more_plus :
case xpath_additive_expr_more_minus :
// These 2 cases are involved for expressions like a+b+c
// The second argument is an additive expression, not a multiplicative as it is the case
// when single a+b expressions are encountered
try
{
o_error = false;
erpp_arg = NULL;
v_execute_one (xpath_multiplicative_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_additive_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
if (u_sub == xpath_additive_expr_more_plus)
v_function_plus (erpp_arg);
else
v_function_minus (erpp_arg);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (7);
break;
}
break;
case xpath_multiplicative_expr :
switch (u_sub)
{
case xpath_multiplicative_expr_simple :
v_execute_one (xpath_unary_expr, o_skip_only);
break;
case xpath_multiplicative_expr_star :
case xpath_multiplicative_expr_div :
case xpath_multiplicative_expr_mod :
try
{
o_error = false;
erpp_arg = NULL;
v_execute_one (xpath_unary_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg = new expression_result * [2];
memset (erpp_arg, 0, 2 * sizeof (expression_result *));
erpp_arg [1] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
}
v_execute_one (xpath_unary_expr, o_skip_only);
if (! o_skip_only)
{
erpp_arg [0] = new expression_result (* xs_stack . erp_top ());
xs_stack . v_pop ();
v_function_mult (erpp_arg, u_sub);
}
}
catch (execution_error)
{
o_error = true;
}
if (erpp_arg)
{
for (u_arg = 0; u_arg < 2; u_arg++)
{
if (erpp_arg [u_arg])
delete erpp_arg [u_arg];
}
delete [] erpp_arg;
}
if (o_error)
throw execution_error (8);
break;
}
break;
case xpath_unary_expr :
switch (u_sub)
{
case xpath_unary_expr_simple :
// [27] UnaryExpr ::= UnionExpr
v_execute_one (xpath_union_expr, o_skip_only);
break;
case xpath_unary_expr_minus :
// [27] UnaryExpr ::= '-' UnaryExpr
v_execute_one (xpath_unary_expr, o_skip_only);
v_function_opposite ();
break;
}
break;
case xpath_union_expr :
switch (u_sub)
{
case xpath_union_expr_simple :
v_execute_one (xpath_path_expr, o_skip_only);
break;
case xpath_union_expr_union :
v_execute_one (xpath_union_expr, o_skip_only);
if (xs_stack . erp_top () -> e_type != e_node_set)
throw execution_error (9);
// here after is a block, so that the node_set are locals to it
{
node_set ns_1, ns_2;
ns_1 = ns_pop_node_set ();
v_execute_one (xpath_path_expr, o_skip_only);
ns_2 = ns_pop_node_set ();
v_function_union (ns_1, ns_2);
}
break;
}
break;
case xpath_path_expr :
switch (u_sub)
{
case xpath_path_expr_location_path :
v_execute_one (xpath_location_path, o_skip_only);
break;
case xpath_path_expr_filter :
v_execute_one (xpath_filter_expr, o_skip_only);
break;
case xpath_path_expr_slash :
v_execute_one (xpath_filter_expr, o_skip_only);
v_execute_one (xpath_relative_location_path, o_skip_only);
break;
case xpath_path_expr_2_slash :
v_execute_one (xpath_filter_expr, o_skip_only);
v_execute_one (xpath_relative_location_path, o_skip_only);
break;
}
break;
case xpath_filter_expr :
switch (u_sub)
{
case xpath_filter_expr_primary :
v_execute_one (xpath_primary_expr, o_skip_only);
break;
case xpath_filter_expr_predicate :
v_execute_one (xpath_filter_expr, o_skip_only);
v_execute_one (xpath_predicate, o_skip_only);
break;
}
break;
case xpath_primary_expr :
switch (u_sub)
{
case xpath_primary_expr_variable :
v_execute_one (xpath_variable_reference, o_skip_only);
break;
case xpath_primary_expr_paren_expr :
v_execute_one (xpath_expr, o_skip_only);
break;
case xpath_primary_expr_literal :
if (! o_skip_only)
v_push_string (S_literal);
break;
case xpath_primary_expr_number :
if (! o_skip_only)
{
if (strchr (S_literal . c_str (), '.'))
v_push_double (atof (S_literal . c_str ()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -