From 28c738d0319bf5de25bcf6aed90234419feded07 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sat, 9 Nov 2019 17:29:15 +0100 Subject: Remove global state from constexp lexer --- src/constexp.h | 23 ++++++++--------------- src/constexp.l | 57 ++++++++++++++++++++++++++++++++++---------------------- src/constexp.y | 21 ++++++++------------- src/constexp_p.h | 44 +++++++++++++++++++++++++++++++++++++++++++ src/pre.h | 2 +- src/pre.l | 3 ++- 6 files changed, 98 insertions(+), 52 deletions(-) create mode 100644 src/constexp_p.h diff --git a/src/constexp.h b/src/constexp.h index 8bf582e..0b52e14 100644 --- a/src/constexp.h +++ b/src/constexp.h @@ -19,24 +19,17 @@ #ifndef _CONSTEXP_H #define _CONSTEXP_H -#include "cppvalue.h" #include -#define YYSTYPE CPPValue -typedef void* yyscan_t; -struct constexpYY_state +class ConstExpressionParser { - QCString g_strToken; - CPPValue g_resultValue; - int g_constExpLineNr; - QCString g_constExpFileName; - - const char *g_inputString; - int g_inputPosition; + public: + ConstExpressionParser(); + ~ConstExpressionParser(); + bool parse(const char *fileName,int line,const QCString &expression); + private: + struct Private; + Private *p; }; -extern bool parseconstexp(const char *fileName,int line,const QCString &s); -extern int constexpYYparse(yyscan_t); -extern int constexpYYlex(YYSTYPE *lvalp, yyscan_t); -struct constexpYY_state* constexpYYget_extra (yyscan_t yyscanner ); #endif diff --git a/src/constexp.l b/src/constexp.l index b6b3c5c..eae8a3b 100644 --- a/src/constexp.l +++ b/src/constexp.l @@ -24,6 +24,7 @@ %{ #include "constexp.h" +#include "constexp_p.h" #include "cppvalue.h" #include "ce_parse.hpp" // generated header file #include "message.h" @@ -31,7 +32,6 @@ #define YY_NO_INPUT 1 #define YY_NO_UNISTD_H 1 - static const char *stateToString(int state); static int yyread(char *buf,int max_size,yyscan_t yyscanner); @@ -70,23 +70,23 @@ CONSTSUFFIX ([uU][lL]?[lL]?)|([lL][lL]?[uU]?) "(" { return TOK_LPAREN; } ")" { return TOK_RPAREN; } "'"(([^\'\n\r\\]+)|(\\(([ntvbrfa\\?'\"])|([0-9]+)|([xX][0-9a-fA-F]+))))"'" { - yyextra->g_strToken=yytext; + yyextra->strToken=yytext; return TOK_CHARACTER; } -0[0-7]*{CONSTSUFFIX}? { yyextra->g_strToken=yytext; +0[0-7]*{CONSTSUFFIX}? { yyextra->strToken=yytext; return TOK_OCTALINT; } -[1-9][0-9]*{CONSTSUFFIX}? { yyextra->g_strToken=yytext; +[1-9][0-9]*{CONSTSUFFIX}? { yyextra->strToken=yytext; return TOK_DECIMALINT; } -(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { yyextra->g_strToken=yytext+2; +(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { yyextra->strToken=yytext+2; return TOK_HEXADECIMALINT; } (([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? { - yyextra->g_strToken=yytext; return TOK_FLOAT; + yyextra->strToken=yytext; return TOK_FLOAT; } ([0-9]+[eE])([\-\+])?[0-9]+([fFlL])? { - yyextra->g_strToken=yytext; return TOK_FLOAT; + yyextra->strToken=yytext; return TOK_FLOAT; } . \n @@ -97,43 +97,56 @@ static int yyread(char *buf,int max_size,yyscan_t yyscanner) { struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; int c=0; - while( c < max_size && yyextra->g_inputString[yyextra->g_inputPosition] ) + while( c < max_size && yyextra->inputString[yyextra->inputPosition] ) { - *buf = yyextra->g_inputString[yyextra->g_inputPosition++] ; + *buf = yyextra->inputString[yyextra->inputPosition++] ; c++; buf++; } return c; } +struct ConstExpressionParser::Private +{ + yyscan_t yyscanner; + struct constexpYY_state constexpYY_extra; +}; -static yyscan_t yyscanner; -static struct constexpYY_state constexpYY_extra; -bool parseconstexp(const char *fileName,int lineNr,const QCString &s) +ConstExpressionParser::ConstExpressionParser() { - constexpYYlex_init_extra(&constexpYY_extra, &yyscanner); - struct yyguts_t *yyg = (struct yyguts_t*)yyscanner; + p = new Private; + constexpYYlex_init_extra(&p->constexpYY_extra, &p->yyscanner); +} + +ConstExpressionParser::~ConstExpressionParser() +{ + constexpYYlex_destroy(p->yyscanner); + delete p; +} + +bool ConstExpressionParser::parse(const char *fileName,int lineNr,const QCString &s) +{ + struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner; #ifdef FLEX_DEBUG yyset_debug(1,yyscanner); #endif - yyextra->g_constExpFileName = fileName; - yyextra->g_constExpLineNr = lineNr; - yyextra->g_inputString = s; - yyextra->g_inputPosition = 0; - constexpYYrestart( yyin, yyscanner ); + yyextra->constExpFileName = fileName; + yyextra->constExpLineNr = lineNr; + yyextra->inputString = s; + yyextra->inputPosition = 0; + constexpYYrestart( yyin, p->yyscanner ); printlex(yy_flex_debug, TRUE, __FILE__, fileName); //printf("Expression: '%s'\n",s.data()); - constexpYYparse(yyscanner); + constexpYYparse(p->yyscanner); //printf("Result: %ld\n",(long)g_resultValue); printlex(yy_flex_debug, FALSE, __FILE__, fileName); - bool result = (long)yyextra->g_resultValue!=0; + bool result = (long)yyextra->resultValue!=0; - constexpYYlex_destroy(yyscanner); return result; } diff --git a/src/constexp.y b/src/constexp.y index 62a51f3..100614a 100644 --- a/src/constexp.y +++ b/src/constexp.y @@ -19,21 +19,16 @@ %{ #include "cppvalue.h" -#include "constexp.h" +#include "constexp_p.h" #include "message.h" -#if defined(_MSC_VER) -#define MSDOS -#endif - - #include #include int constexpYYerror(yyscan_t yyscanner, const char *s) { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - warn(yyextra->g_constExpFileName, yyextra->g_constExpLineNr, + warn(yyextra->constExpFileName, yyextra->constExpLineNr, "preprocessing issue while doing constant expression evaluation: %s",s); return 0; } @@ -80,7 +75,7 @@ int constexpYYerror(yyscan_t yyscanner, const char *s) start: constant_expression { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - yyextra->g_resultValue = $1; return 0; + yyextra->resultValue = $1; return 0; } ; @@ -272,27 +267,27 @@ primary_expression: constant constant: TOK_OCTALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseOctal(yyextra->g_strToken); + $$ = parseOctal(yyextra->strToken); } | TOK_DECIMALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseDecimal(yyextra->g_strToken); + $$ = parseDecimal(yyextra->strToken); } | TOK_HEXADECIMALINT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseHexadecimal(yyextra->g_strToken); + $$ = parseHexadecimal(yyextra->strToken); } | TOK_CHARACTER { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseCharacter(yyextra->g_strToken); + $$ = parseCharacter(yyextra->strToken); } | TOK_FLOAT { struct constexpYY_state* yyextra = constexpYYget_extra(yyscanner); - $$ = parseFloat(yyextra->g_strToken); + $$ = parseFloat(yyextra->strToken); } ; diff --git a/src/constexp_p.h b/src/constexp_p.h new file mode 100644 index 0000000..ad09b2d --- /dev/null +++ b/src/constexp_p.h @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2019 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. + * + */ + +#ifndef _CONSTEXP_P_H +#define _CONSTEXP_P_H + +#include + +//! @file +//! @brief Private interface between Parser (constexp.y) and Lexer (constexp.l) + +#include "cppvalue.h" +#define YYSTYPE CPPValue + +typedef void* yyscan_t; +struct constexpYY_state +{ + QCString strToken; + CPPValue resultValue; + int constExpLineNr; + QCString constExpFileName; + + const char *inputString; + int inputPosition; +}; +constexpYY_state* constexpYYget_extra(yyscan_t yyscanner ); + +extern int constexpYYlex(YYSTYPE *lvalp, yyscan_t); +extern int constexpYYparse(yyscan_t); + + +#endif diff --git a/src/pre.h b/src/pre.h index 193ab60..137b397 100644 --- a/src/pre.h +++ b/src/pre.h @@ -28,7 +28,7 @@ class Preprocessor void processFile(const char *fileName,BufStr &input,BufStr &output); void addSearchDir(const char *dir); private: - class Private; + struct Private; Private *p; }; diff --git a/src/pre.l b/src/pre.l index ecf6b57..0ce7eaa 100644 --- a/src/pre.l +++ b/src/pre.l @@ -380,6 +380,7 @@ struct preYY_state QCString delimiter; QDict allIncludes; DefineManager defineManager; + ConstExpressionParser constExpParser; }; // stateless functions @@ -2704,7 +2705,7 @@ static bool computeExpression(yyscan_t yyscanner,const QCString &expr) e = removeIdsAndMarkers(e); if (e.isEmpty()) return FALSE; //printf("parsing '%s'\n",e.data()); - return parseconstexp(state->yyFileName,state->yyLineNr,e); + return state->constExpParser.parse(state->yyFileName,state->yyLineNr,e); } /*! expands the macro definition in \a name -- cgit v0.12