diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-10-17 20:42:47 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-10-17 20:42:47 (GMT) |
commit | 985d092d4d9f6d38c794755c3c64405ef7ec8d35 (patch) | |
tree | 382b35ed4376ba936acb4f160dd4fc5b76173dc6 /Source/cmExprParser.y | |
parent | 427ed70363ad4aea83e071f46d9704f69472017d (diff) | |
download | CMake-985d092d4d9f6d38c794755c3c64405ef7ec8d35.zip CMake-985d092d4d9f6d38c794755c3c64405ef7ec8d35.tar.gz CMake-985d092d4d9f6d38c794755c3c64405ef7ec8d35.tar.bz2 |
ENH: Add rudamentary mathematical expression support
Diffstat (limited to 'Source/cmExprParser.y')
-rw-r--r-- | Source/cmExprParser.y | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/Source/cmExprParser.y b/Source/cmExprParser.y new file mode 100644 index 0000000..485972c --- /dev/null +++ b/Source/cmExprParser.y @@ -0,0 +1,171 @@ +%{ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +/* + +This file must be translated to C and modified to build everywhere. + +Run bison like this: + + bison --yacc --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y + +Modify cmExprParser.cxx: + - remove TABs + - add __HP_aCC to the #if test for yyerrorlab warning suppression + +*/ + +/* Configure the parser to use a lexer object. */ +#define YYPARSE_PARAM yyscanner +#define YYLEX_PARAM yyscanner +#define YYERROR_VERBOSE 1 +#define cmExpr_yyerror(x) \ + cmExprError(yyscanner, x) +#define yyGetParser (cmExpr_yyget_extra(yyscanner)) + +/*-------------------------------------------------------------------------*/ +#include "cmExprParserHelper.h" /* Interface to parser object. */ +#include "cmExprLexer.h" /* Interface to lexer object. */ +#include "cmExprParserTokens.h" /* Need YYSTYPE for YY_DECL. */ + +#include <math.h> + +/* Forward declare the lexer entry point. */ +YY_DECL; + +/* Internal utility functions. */ +static void cmExprError(yyscan_t yyscanner, const char* message); + +#define YYDEBUG 1 +//#define YYMAXDEPTH 100000 +//#define YYINITDEPTH 10000 + + +/* Disable some warnings in the generated code. */ +#ifdef __BORLANDC__ +# pragma warn -8004 /* Variable assigned a value that is not used. */ +#endif +#ifdef _MSC_VER +# pragma warning (disable: 4102) /* Unused goto label. */ +# pragma warning (disable: 4065) /* Switch statement contains default but no case. */ +#endif +%} + +/* Generate a reentrant parser object. */ +%pure_parser + +/*-------------------------------------------------------------------------*/ +/* Tokens */ +%token exp_PLUS +%token exp_MINUS +%token exp_TIMES +%token exp_DIVIDE +%token exp_MOD +%token exp_SHIFTLEFT +%token exp_SHIFTRIGHT +%token exp_OPENPARENT +%token exp_CLOSEPARENT +%token exp_OR; +%token exp_AND; +%token exp_XOR; +%token exp_NOT; +%token exp_NUMBER; + +/*-------------------------------------------------------------------------*/ +/* grammar */ +%% + + +Start: +exp +{ + yyGetParser->SetResult($<Number>1); +} + +exp: +bitwiseor +{$<Number>$ = $<Number>1;} +| +exp exp_OR bitwiseor +{$<Number>$ = $<Number>1 | $<Number>3;} + +bitwiseor: +bitwisexor +{$<Number>$ = $<Number>1;} +| +bitwiseor exp_XOR bitwisexor +{$<Number>$ = $<Number>1 ^ $<Number>3;} + +bitwisexor: +bitwiseand +{$<Number>$ = $<Number>1;} +| +bitwisexor exp_AND bitwiseand +{$<Number>$ = $<Number>1 & $<Number>3;} + +bitwiseand: +term +{$<Number>$ = $<Number>1;} +| +bitwiseand exp_PLUS term +{$<Number>$ = $<Number>1 + $<Number>3;} +| +bitwiseand exp_MINUS term +{$<Number>$ = $<Number>1 - $<Number>3;} + +term: +factor +{$<Number>$ = $<Number>1;} +| +term exp_TIMES factor +{$<Number>$ = $<Number>1 * $<Number>3;} +| +term exp_DIVIDE factor +{$<Number>$ = $<Number>1 / $<Number>3;} +| +term exp_MOD factor +{$<Number>$ = $<Number>1 % $<Number>3;} + +factor: +shift +{$<Number>$ = $<Number>1;} +| +factor exp_SHIFTLEFT shift +{$<Number>$ = $<Number>1 << $<Number>3;} +| +factor exp_SHIFTRIGHT shift +{$<Number>$ = $<Number>1 >> $<Number>3;} + + +shift: +exp_NUMBER +{$<Number>$ = $<Number>1;} +| +exp_OPENPARENT exp exp_CLOSEPARENT +{$<Number>$ = $<Number>2;} +; + + +%% +/* End of grammar */ + +/*--------------------------------------------------------------------------*/ +void cmExprError(yyscan_t yyscanner, const char* message) +{ + yyGetParser->Error(message); +} + |