Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutorial5/src/libraries/util/ExprParser.h @ 10422

Last change on this file since 10422 was 8858, checked in by landauf, 13 years ago

merged output branch back to trunk.

Changes:

  • you have to include util/Output.h instead of util/Debug.h
  • COUT(x) is now called orxout(level)
  • output levels are now defined by an enum instead of numbers. see util/Output.h for the definition
  • it's possible to use output contexts with orxout(level, context). see util/Output.h for some common contexts. you can define more contexts
  • you must use 'endl' at the end of an output message, '\n' does not flush the message

Output levels:

  • instead of COUT(0) use orxout()
  • instead of COUT(1) use orxout(user_error) or orxout(internal_error)
  • instead of COUT(2) use orxout(user_warning) or orxout(internal_warning)
  • instead of COUT(3) use orxout(user_status/user_info) or orxout(internal_status/internal_info)
  • instead of COUT(4) use orxout(verbose)
  • instead of COUT(5) use orxout(verbose_more)
  • instead of COUT(6) use orxout(verbose_ultra)

Guidelines:

  • user_* levels are for the user, visible in the console and the log-file
  • internal_* levels are for developers, visible in the log-file
  • verbose_* levels are for debugging, only visible if the context of the output is activated

Usage in C++:

  • orxout() << "message" << endl;
  • orxout(level) << "message" << endl;
  • orxout(level, context) << "message" << endl;

Usage in Lua:

  • orxout("message")
  • orxout(orxonox.level.levelname, "message")
  • orxout(orxonox.level.levelname, "context", "message")

Usage in Tcl (and in the in-game-console):

  • orxout levelname message
  • orxout_context levelname context message
  • shortcuts: log message, error message, warning message, status message, info message, debug message
  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@ingroup Util
32@brief Declaration of FloatParser
33*/
34
35#ifndef _FloatParser_H__
36#define _FloatParser_H__
37
38#include "UtilPrereqs.h"
39
40#include <map>
41#include <string>
42
43namespace orxonox
44{
45    /** Parser for expressions like \c "3 * cos(5 + 4) / a" where \a a is a predeclared
46        variable.
47    @par Usage
48        Using it is rather simple:
49        @code
50        std::string str("3 + 4");
51        ExprParser expr;
52        expr.parse(str);
53        if (expr.getSuccess())
54        {
55            if (!expr.getRemains().empty())
56            {
57                orxout(user_warning) << "Expression could not be parsed to the end! Remains: '" << expr.getRemains() << '\'' << endl;
58            }
59            float result = expr.getResult();
60        }
61        else
62            orxout(user_error) << "Cannot calculate expression: Parse error." << endl;
63        @endcode
64        getRemains() returns the expression after what could be parsed. For instance
65        \c "2*3 text" will return \c "text" as remains.
66    @details
67        The implementation of this class is really old and sort of a trial for
68        a first C++ class by Reto. That explains why it looks more like C than
69        C++... Also some of the variable names are in German. <br>
70        Explaining how it works exactly is probably not possible anymore, but it
71        is based on recursively parsing the expression character by character.
72        That much I can remember.
73    @par Functions, operators and variables supported
74        - Variables:
75            - e
76            - pi
77        - Functions:
78            - sin, asin, sinh, asinh
79            - cos, acos, cosh, acosh
80            - tan, atan, tanh, atanh
81            - int, floor, ceil, abs, sign
82            - pow, sqrt, exp, ln, log
83            - mod, div
84            - min, max
85            - radians, degrees
86        - Operators:
87            - +, -, ! (unary)
88            - +, -, *, /, %, ^, |, &, !, <, >, !=, <=, >=, =
89    @note
90        Operators may not be very consistent with C++ rules, but using the class
91        for plus and minus should be perfectly ok.
92    */
93    class _UtilExport ExprParser
94    {
95    public:
96        enum binary_operator
97        {
98            b_plus,
99            b_minus,
100            mal,
101            durch,
102            modulo,
103            hoch,
104            undef,
105            oder,
106            und,
107            gleich,
108            b_nicht,
109            kleiner,
110            groesser,
111            ungleich,
112            kleinergleich,
113            groessergleich
114        };
115
116        enum unary_operator
117        {
118            u_plus,
119            u_minus,
120            u_nicht
121        };
122
123
124        ExprParser();
125        void parse(const std::string& str);
126        const std::string& getRemains() { return  this->remains_; }
127        float              getResult()  { return  this->result_; }
128        bool               getSuccess() { return !this->failed_; }
129
130        void setVariable(const std::string& varname, float value);
131
132    private:
133        float parse_expr_1();
134        float parse_expr_2();
135        float parse_expr_3();
136        float parse_expr_4();
137        float parse_expr_5();
138        float parse_expr_6();
139        float parse_expr_7();
140        float parse_expr_8();
141        char* parse_word(char* str);
142        binary_operator parse_binary_operator();
143        unary_operator parse_unary_operator();
144
145        float parse_argument();
146        float parse_last_argument();
147
148        binary_operator op;
149        const char* reading_stream;
150        bool failed_;
151        float result_;
152        std::string remains_;
153        std::map<std::string, float> variables_;
154    };
155
156    //Endzeichen für float expression: ')', '}', ']', ',', ';'
157    _UtilExport bool parse_float(char* const, char**, float*);
158    //Endzeichen angegeben
159    _UtilExport bool parse_float(char* const, char**, char, float*);
160    //Letzter Teil-float eines Vektors parsen (keine Vergleichs- und Logikoperationen)
161    _UtilExport bool parse_vector_float(char* const, char**, bool, float*);
162}
163
164#endif /* _FloatParser_H__ */
Note: See TracBrowser for help on using the repository browser.