⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpath_processor.cpp

📁 j2me is based on j2mepolish, client & server for mobile application.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	         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 + -