Doxygen
Loading...
Searching...
No Matches
CondParser Class Reference

Copyright (C) 1997-2015 by Dimitri van Heesch. More...

#include <src/condparser.h>

+ Collaboration diagram for CondParser:

Public Member Functions

 CondParser ()
 
bool parse (const QCString &fileName, int lineNr, const QCString &expr)
 Copyright (C) 1997-2015 by Dimitri van Heesch.
 

Private Types

enum  TOKENTYPE { NOTHING = -1 , DELIMITER , VARIABLE , UNKNOWN }
 
enum  OPERATOR_ID { UNKNOWN_OP = -1 , AND = 1 , OR , NOT }
 

Private Member Functions

void getToken ()
 Get next token in the current string expr.
 
bool parseLevel1 ()
 conditional operators AND and OR
 
bool parseLevel2 ()
 NOT.
 
bool parseLevel3 ()
 parenthesized expression or variable
 
bool parseVar ()
 
bool evalOperator (const int opId, bool lhs, bool rhs)
 evaluate an operator for given values
 
bool evalVariable (const QCString &varName)
 evaluate a variable
 
int getOperatorId (const QCString &opName)
 returns the id of the given operator returns -1 if the operator is not recognized
 

Private Attributes

QCString m_err
 error state
 
QCString m_expr
 holds the expression
 
const char * m_e
 points to a character in expr
 
QCString m_token
 holds the token
 
TOKENTYPE m_tokenType
 type of the token
 

Detailed Description

Copyright (C) 1997-2015 by Dimitri van Heesch.

Permission to use, copy, modify, and distribute this software and its documentation under the terms of the GNU General Public License is hereby granted. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. See the GNU General Public License for more details.

Documents produced by Doxygen are derivative works derived from the input used in their production; they are not affected by this license.

C++ Expression parser for ENABLED_SECTIONS in Doxygen

Features used: Operators: && AND operator || OR operator ! NOT operator

Definition at line 27 of file condparser.h.

Member Enumeration Documentation

◆ OPERATOR_ID

Enumerator
UNKNOWN_OP 
AND 
OR 
NOT 

Definition at line 43 of file condparser.h.

44 {
45 UNKNOWN_OP = -1,
46 AND = 1,
47 OR,
48 NOT
49 };

◆ TOKENTYPE

enum CondParser::TOKENTYPE
private
Enumerator
NOTHING 
DELIMITER 
VARIABLE 
UNKNOWN 

Definition at line 36 of file condparser.h.

37 {
38 NOTHING = -1,
42 };

Constructor & Destructor Documentation

◆ CondParser()

CondParser::CondParser ( )
inline

Definition at line 31 of file condparser.h.

31: m_e(nullptr), m_tokenType(NOTHING) {}
TOKENTYPE m_tokenType
type of the token
Definition condparser.h:59
const char * m_e
points to a character in expr
Definition condparser.h:56

References m_e, m_tokenType, and NOTHING.

Member Function Documentation

◆ evalOperator()

bool CondParser::evalOperator ( const int opId,
bool lhs,
bool rhs )
private

evaluate an operator for given values

Definition at line 264 of file condparser.cpp.

265{
266 switch (opId)
267 {
268 // level 2
269 case AND: return lhs && rhs;
270 case OR: return lhs || rhs;
271 }
272
273 m_err = "Internal error unknown operator: id="+QCString().setNum(opId);
274 return FALSE;
275}
QCString m_err
error state
Definition condparser.h:54
#define FALSE
Definition qcstring.h:34

References AND, FALSE, m_err, OR, and QCString::setNum().

Referenced by parseLevel1().

◆ evalVariable()

bool CondParser::evalVariable ( const QCString & varName)
private

evaluate a variable

Definition at line 280 of file condparser.cpp.

281{
282 const StringVector &list = Config_getList(ENABLED_SECTIONS);
283 return std::find(list.begin(),list.end(),varName.str())!=list.end();
284}
const std::string & str() const
Definition qcstring.h:537
#define Config_getList(name)
Definition config.h:38
std::vector< std::string > StringVector
Definition containers.h:33

References Config_getList, and QCString::str().

Referenced by parseVar().

◆ getOperatorId()

int CondParser::getOperatorId ( const QCString & opName)
private

returns the id of the given operator returns -1 if the operator is not recognized

Definition at line 91 of file condparser.cpp.

92{
93 // level 2
94 if (opName=="&&") { return AND; }
95 if (opName=="||") { return OR; }
96
97 // not operator
98 if (opName=="!") { return NOT; }
99
100 return UNKNOWN_OP;
101}

References AND, NOT, OR, and UNKNOWN_OP.

Referenced by parseLevel1(), and parseLevel2().

◆ getToken()

void CondParser::getToken ( )
private

Get next token in the current string expr.

Uses the data in m_expr pointed to by m_e to produce m_tokenType and m_token, set m_err in case of an error

Definition at line 108 of file condparser.cpp.

109{
111 m_token.clear();
112
113 //printf("\tgetToken e:{%c}, ascii=%i, col=%i\n", *e, *e, e-expr);
114
115 // skip over whitespaces
116 while (*m_e == ' ' || *m_e == '\t' || *m_e == '\n') // space or tab or newline
117 {
118 m_e++;
119 }
120
121 // check for end of expression
122 if (*m_e=='\0')
123 {
124 // token is still empty
126 return;
127 }
128
129 // check for parentheses
130 if (*m_e == '(' || *m_e == ')')
131 {
133 m_token += *m_e++;
134 return;
135 }
136
137 // check for operators (delimiters)
138 if (isDelimiter(*m_e))
139 {
141 while (isDelimiter(*m_e))
142 {
143 m_token += *m_e++;
144 }
145 return;
146 }
147
148 // check for variables
149 if (isAlpha(*m_e))
150 {
152 while (isAlphaNumSpec(*m_e))
153 {
154 m_token += *m_e++;
155 }
156 return;
157 }
158
159 // something unknown is found, wrong characters -> a syntax error
161 while (*m_e)
162 {
163 m_token += *m_e++;
164 }
165 m_err = QCString("Syntax error in part '")+m_token+"'";
166 return;
167}
QCString m_token
holds the token
Definition condparser.h:58
static bool isDelimiter(const char c)
checks if the given char c is a delimiter minus is checked apart, can be unary minus
static bool isAlphaNumSpec(const char c)
static bool isAlpha(const char c)
checks if the given char c is a letter or underscore

References DELIMITER, isAlpha(), isAlphaNumSpec(), isDelimiter(), m_e, m_err, m_token, m_tokenType, NOTHING, UNKNOWN, and VARIABLE.

Referenced by parse(), parseLevel1(), parseLevel2(), parseLevel3(), and parseVar().

◆ parse()

bool CondParser::parse ( const QCString & fileName,
int lineNr,
const QCString & expr )

Copyright (C) 1997-2015 by Dimitri van Heesch.

Permission to use, copy, modify, and distribute this software and its documentation under the terms of the GNU General Public License is hereby granted. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. See the GNU General Public License for more details.

Documents produced by Doxygen are derivative works derived from the input used in their production; they are not affected by this license.

C++ Expression parser for ENABLED_SECTIONS in Doxygen

Features used: Operators: && AND operator || OR operator ! NOT operator parses and evaluates the given expression.

Returns
  • On error, an error message is returned.
  • On success, the result of the expression is either "1" or "0".

Definition at line 36 of file condparser.cpp.

37{
38 if (expr.isEmpty()) return false;
39 m_expr = expr;
41
42 // initialize all variables
43 m_e = m_expr.data(); // let m_e point to the start of the expression
44
45 bool answer=false;
46 getToken();
47 if (m_tokenType==DELIMITER && m_token.isEmpty())
48 {
49 // empty expression: answer==FALSE
50 }
51 else if (m_err.isEmpty())
52 {
53 answer = parseLevel1();
54 }
55 if (!m_err.isEmpty())
56 {
57 warn(fileName,lineNr,"problem evaluating expression '%s': %s",
58 qPrint(expr),qPrint(m_err));
59 }
60 //printf("expr='%s' answer=%d\n",expr,answer);
61 return answer;
62}
bool parseLevel1()
conditional operators AND and OR
void getToken()
Get next token in the current string expr.
QCString m_expr
holds the expression
Definition condparser.h:55
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
#define warn(file, line, fmt,...)
Definition message.h:59
const char * qPrint(const char *s)
Definition qcstring.h:672

References DELIMITER, getToken(), QCString::isEmpty(), m_e, m_err, m_expr, m_token, m_tokenType, NOTHING, parseLevel1(), qPrint(), and warn.

Referenced by handleGuard(), startCondSection(), and startCondSection().

◆ parseLevel1()

bool CondParser::parseLevel1 ( )
private

conditional operators AND and OR

Definition at line 173 of file condparser.cpp.

174{
175 bool ans = parseLevel2();
176 int opId = getOperatorId(m_token);
177
178 while (opId==AND || opId==OR)
179 {
180 getToken();
181 ans = evalOperator(opId, ans, parseLevel2());
182 opId = getOperatorId(m_token);
183 }
184
185 return ans;
186}
bool parseLevel2()
NOT.
bool evalOperator(const int opId, bool lhs, bool rhs)
evaluate an operator for given values
int getOperatorId(const QCString &opName)
returns the id of the given operator returns -1 if the operator is not recognized

References AND, evalOperator(), getOperatorId(), getToken(), m_token, OR, and parseLevel2().

Referenced by parse(), and parseLevel3().

◆ parseLevel2()

bool CondParser::parseLevel2 ( )
private

NOT.

Definition at line 191 of file condparser.cpp.

192{
193 int opId = getOperatorId(m_token);
194 if (opId == NOT)
195 {
196 getToken();
197 return !parseLevel3();
198 }
199 else
200 {
201 return parseLevel3();
202 }
203}
bool parseLevel3()
parenthesized expression or variable

References getOperatorId(), getToken(), m_token, NOT, and parseLevel3().

Referenced by parseLevel1().

◆ parseLevel3()

bool CondParser::parseLevel3 ( )
private

parenthesized expression or variable

Definition at line 209 of file condparser.cpp.

210{
211 // check if it is a parenthesized expression
212 if (m_tokenType == DELIMITER)
213 {
214 if (m_token=="(")
215 {
216 getToken();
217 bool ans = parseLevel1();
218 if (m_tokenType!=DELIMITER || m_token!=")")
219 {
220 m_err="Parenthesis ) missing";
221 return FALSE;
222 }
223 getToken();
224 return ans;
225 }
226 }
227
228 // if not parenthesized then the expression is a variable
229 return parseVar();
230}
bool parseVar()

References DELIMITER, FALSE, getToken(), m_err, m_token, m_tokenType, parseLevel1(), and parseVar().

Referenced by parseLevel2().

◆ parseVar()

bool CondParser::parseVar ( )
private

Definition at line 233 of file condparser.cpp.

234{
235 bool ans = false;
236 switch (m_tokenType)
237 {
238 case VARIABLE:
239 // this is a variable
240 ans = evalVariable(m_token);
241 getToken();
242 break;
243
244 default:
245 // syntax error or unexpected end of expression
246 if (m_token.isEmpty())
247 {
248 m_err="Unexpected end of expression";
249 return FALSE;
250 }
251 else
252 {
253 m_err="Value expected";
254 return FALSE;
255 }
256 break;
257 }
258 return ans;
259}
bool evalVariable(const QCString &varName)
evaluate a variable

References evalVariable(), FALSE, getToken(), m_err, m_token, m_tokenType, and VARIABLE.

Referenced by parseLevel3().

Member Data Documentation

◆ m_e

const char* CondParser::m_e
private

points to a character in expr

Definition at line 56 of file condparser.h.

Referenced by CondParser(), getToken(), and parse().

◆ m_err

QCString CondParser::m_err
private

error state

Definition at line 54 of file condparser.h.

Referenced by evalOperator(), getToken(), parse(), parseLevel3(), and parseVar().

◆ m_expr

QCString CondParser::m_expr
private

holds the expression

Definition at line 55 of file condparser.h.

Referenced by parse().

◆ m_token

QCString CondParser::m_token
private

holds the token

Definition at line 58 of file condparser.h.

Referenced by getToken(), parse(), parseLevel1(), parseLevel2(), parseLevel3(), and parseVar().

◆ m_tokenType

TOKENTYPE CondParser::m_tokenType
private

type of the token

Definition at line 59 of file condparser.h.

Referenced by CondParser(), getToken(), parse(), parseLevel3(), and parseVar().


The documentation for this class was generated from the following files: