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 <boost/scoped_ptr.hpp>
49 #include "gromacs/utility/gmxassert.h"
51 #include "parsetree.h"
56 //! Error handler needed by Bison.
58 yyerror(yyscan_t scanner, char const *s)
60 _gmx_selparser_error(scanner, "%s", s);
63 /*! \name Exception handling macros for actions
65 * These macros should be used at the beginning and end of each semantic action
66 * that may throw an exception. For robustness, it's best to wrap all actions
67 * that call functions declared outside parser.y should be wrapped.
68 * These macros take care to catch any exceptions, store the exception (or
69 * handle it and allow the parser to continue), and terminate the parser
70 * cleanly if necessary.
71 * The code calling the parser should use
72 * _gmx_sel_lexer_rethrow_exception_if_occurred() to rethrow any exceptions.
75 //! Starts an action that may throw exceptions.
76 #define BEGIN_ACTION \
78 //! Finishes an action that may throw exceptions.
81 catch(const std::exception &ex) \
83 if (_gmx_selparser_handle_exception(scanner, ex)) \
91 //! No-op to enable use of same get()/set() implementation as with C++11.
92 static gmx::SelectionParserValue &move(gmx::SelectionParserValue &src)
99 * Retrieves a semantic value.
101 * \param[in] src Semantic value to get the value from.
102 * \returns Retrieved value.
103 * \throws unspecified Any exception thrown by the move constructor of
104 * ValueType (copy constructor if GMX_CXX11 is not set).
106 * There should be no statements that may throw exceptions in actions before
107 * this function has been called for all semantic values that have a C++ object
108 * stored. Together with set(), this function abstracts away exception
109 * safety issues that arise from the use of a plain pointer for storing the
112 * Does not throw for smart pointer types. If used with types that may throw,
113 * the order of operations should be such that it is exception-safe.
115 template <typename ValueType> static
116 ValueType get(ValueType *src)
118 GMX_RELEASE_ASSERT(src != NULL, "Semantic value pointers should be non-NULL");
119 boost::scoped_ptr<ValueType> srcGuard(src);
120 return ValueType(move(*src));
123 * Sets a semantic value.
125 * \tparam ValueType Type of value to set.
126 * \param[out] dest Semantic value to set (typically $$).
127 * \param[in] value Value to put into the semantic value.
128 * \throws std::bad_alloc if out of memory.
129 * \throws unspecified Any exception thrown by the move constructor of
130 * ValueType (copy constructor if GMX_CXX11 is not set).
132 * This should be the last statement before ::END_ACTION, except for a
133 * possible ::CHECK_SEL.
135 template <typename ValueType> static
136 void set(ValueType *&dest, ValueType value)
138 dest = new ValueType(move(value));
141 * Sets an empty semantic value.
143 * \tparam ValueType Type of value to set (must be default constructible).
144 * \param[out] dest Semantic value to set (typically $$).
145 * \throws std::bad_alloc if out of memory.
146 * \throws unspecified Any exception thrown by the default constructor of
149 * This should be the last statement before ::END_ACTION, except for a
150 * possible ::CHECK_SEL.
152 template <typename ValueType> static
153 void set_empty(ValueType *&dest)
155 dest = new ValueType;
158 * Checks that a valid tree was set.
160 * Should be called after set() if it was used to set a value where NULL
161 * pointer indicates an error.
164 * Get rid of this macro. It should now be possible to handle all errors using
167 #define CHECK_SEL(sel) \