3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
32 * \brief Helper functions for the selection parser.
34 * This header is includes only from parser.cpp (generated from parser.y), and
35 * it includes functions and macros used internally by the parser.
36 * They are in a separate file to make then easier to edit (no need to
37 * regenerate the parser), and to keep parser.y as simple as possible.
39 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
40 * \ingroup module_selection
42 #ifndef GMX_SELECTION_PARSER_INTERNAL_H
43 #define GMX_SELECTION_PARSER_INTERNAL_H
47 #include "parsetree.h"
52 //! Helper method to reorder a list of parameter values and to count the values.
53 static t_selexpr_value *
54 process_value_list(t_selexpr_value *values, int *nr)
56 t_selexpr_value *val, *pval, *nval;
58 /* Count values (if needed) and reverse list */
81 //! Helper method to reorder a list of parameters.
82 static t_selexpr_param *
83 process_param_list(t_selexpr_param *params)
85 t_selexpr_param *par, *ppar, *npar;
102 //! Error handler needed by Bison.
104 yyerror(yyscan_t scanner, char const *s)
106 _gmx_selparser_error(scanner, "%s", s);
109 /*! \name Exception handling macros for actions
111 * These macros should be used at the beginning and end of each semantic action
112 * that may throw an exception. For robustness, it's best to wrap all actions
113 * that call functions declared outside parser.y should be wrapped.
114 * These macros take care to catch any exceptions, store the exception (or
115 * handle it and allow the parser to continue), and terminate the parser
116 * cleanly if necessary.
117 * The code calling the parser should use
118 * _gmx_sel_lexer_rethrow_exception_if_occurred() to rethrow any exceptions.
121 //! Starts an action that may throw exceptions.
122 #define BEGIN_ACTION \
124 //! Finishes an action that may throw exceptions.
127 catch(const std::exception &ex) \
129 if (_gmx_selparser_handle_exception(scanner, ex)) \
137 * Retrieves a selection tree pointer from a semantic value.
139 * \param[in] src Semantic value to get the tree from.
140 * \returns Pointer to the selection tree.
142 * There should be no statements that may throw exceptions in actions before
143 * this function has been called for all semantic values that have a tree
144 * argument. Together with set(), this function abstracts away exception
145 * safety issues that arise from the use of a plain pointer for storing the
146 * selection tree semantic values.
150 static gmx::SelectionTreeElementPointer
151 get(gmx::SelectionTreeElementPointer *src)
153 gmx::SelectionTreeElementPointer result;
162 * Sets a selection tree pointer to a semantic value.
164 * \param[out] dest Semantic value to set the tree to.
165 * \param[in] value Pointer to the selection tree to set.
166 * \throws std::bad_alloc if out of memory.
168 * This should be the last statement before ::END_ACTION, except for a
169 * possible ::CHECK_SEL.
172 set(gmx::SelectionTreeElementPointer *&dest,
173 const gmx::SelectionTreeElementPointer &value)
175 dest = new gmx::SelectionTreeElementPointer(value);
178 * Checks that a valid tree was set.
180 * Should be called after set() if it was used to set a value where NULL
181 * pointer indicates an error.
184 * Get rid of this macro. It should now be possible to handle all errors using
187 #define CHECK_SEL(sel) \