mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-04 14:50:23 +00:00
Merge topic 'math-EXPR-unary'
2810e561math(EXPR): Add support for unary `+` and `-` expressions834f52a6cmExprParser: Revise indentation style to match rest of CMake7aaed265cmExprParser: Port to bison 3
This commit is contained in:
5
Help/release/dev/math-EXPR-unary.rst
Normal file
5
Help/release/dev/math-EXPR-unary.rst
Normal file
@@ -0,0 +1,5 @@
|
||||
math-EXPR-unary
|
||||
---------------
|
||||
|
||||
* The :command:`math(EXPR)` command gained support for unary
|
||||
``+`` and ``-`` expressions.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -10,21 +10,12 @@ Run bison like this:
|
||||
bison --yacc --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y
|
||||
|
||||
Modify cmExprParser.cxx:
|
||||
- remove TABs
|
||||
- remove use of the 'register' storage class specifier
|
||||
- add __HP_aCC to the #if test for yyerrorlab warning suppression
|
||||
- "#if 0" out yyerrorlab block in range ["goto yyerrlab1", "yyerrlab1:"]
|
||||
|
||||
*/
|
||||
|
||||
/* 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))
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
#define YYDEBUG 1
|
||||
#include "cmExprParserHelper.h" /* Interface to parser object. */
|
||||
#include "cmExprLexer.h" /* Interface to lexer object. */
|
||||
#include "cmExprParserTokens.h" /* Need YYSTYPE for YY_DECL. */
|
||||
@@ -34,13 +25,8 @@ Modify cmExprParser.cxx:
|
||||
/* 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
|
||||
|
||||
/* Helper function to forward error callback from parser. */
|
||||
static void cmExpr_yyerror(yyscan_t yyscanner, const char* message);
|
||||
|
||||
/* Disable some warnings in the generated code. */
|
||||
#ifdef _MSC_VER
|
||||
@@ -50,7 +36,13 @@ static void cmExprError(yyscan_t yyscanner, const char* message);
|
||||
%}
|
||||
|
||||
/* Generate a reentrant parser object. */
|
||||
%pure_parser
|
||||
%define api.pure
|
||||
|
||||
/* Configure the parser to use a lexer object. */
|
||||
%lex-param {yyscan_t yyscanner}
|
||||
%parse-param {yyscan_t yyscanner}
|
||||
|
||||
%define parse.error verbose
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/* Tokens */
|
||||
@@ -74,82 +66,97 @@ static void cmExprError(yyscan_t yyscanner, const char* message);
|
||||
%%
|
||||
|
||||
|
||||
Start:
|
||||
exp
|
||||
{
|
||||
yyGetParser->SetResult($<Number>1);
|
||||
}
|
||||
start:
|
||||
exp {
|
||||
cmExpr_yyget_extra(yyscanner)->SetResult($<Number>1);
|
||||
}
|
||||
|
||||
exp:
|
||||
bitwiseor
|
||||
{$<Number>$ = $<Number>1;}
|
||||
|
|
||||
exp exp_OR bitwiseor
|
||||
{$<Number>$ = $<Number>1 | $<Number>3;}
|
||||
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 {
|
||||
$<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 {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| bitwisexor exp_AND bitwiseand {
|
||||
$<Number>$ = $<Number>1 & $<Number>3;
|
||||
}
|
||||
|
||||
bitwiseand:
|
||||
shift
|
||||
{$<Number>$ = $<Number>1;}
|
||||
|
|
||||
bitwiseand exp_SHIFTLEFT shift
|
||||
{$<Number>$ = $<Number>1 << $<Number>3;}
|
||||
|
|
||||
bitwiseand exp_SHIFTRIGHT shift
|
||||
{$<Number>$ = $<Number>1 >> $<Number>3;}
|
||||
|
||||
shift {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| bitwiseand exp_SHIFTLEFT shift {
|
||||
$<Number>$ = $<Number>1 << $<Number>3;
|
||||
}
|
||||
| bitwiseand exp_SHIFTRIGHT shift {
|
||||
$<Number>$ = $<Number>1 >> $<Number>3;
|
||||
}
|
||||
|
||||
shift:
|
||||
term
|
||||
{$<Number>$ = $<Number>1;}
|
||||
|
|
||||
shift exp_PLUS term
|
||||
{$<Number>$ = $<Number>1 + $<Number>3;}
|
||||
|
|
||||
shift exp_MINUS term
|
||||
{$<Number>$ = $<Number>1 - $<Number>3;}
|
||||
term {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| shift exp_PLUS term {
|
||||
$<Number>$ = $<Number>1 + $<Number>3;
|
||||
}
|
||||
| shift 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;}
|
||||
unary {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| term exp_TIMES unary {
|
||||
$<Number>$ = $<Number>1 * $<Number>3;
|
||||
}
|
||||
| term exp_DIVIDE unary {
|
||||
$<Number>$ = $<Number>1 / $<Number>3;
|
||||
}
|
||||
| term exp_MOD unary {
|
||||
$<Number>$ = $<Number>1 % $<Number>3;
|
||||
}
|
||||
|
||||
unary:
|
||||
factor {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| exp_PLUS unary {
|
||||
$<Number>$ = + $<Number>2;
|
||||
}
|
||||
| exp_MINUS unary {
|
||||
$<Number>$ = - $<Number>2;
|
||||
}
|
||||
|
||||
factor:
|
||||
exp_NUMBER
|
||||
{$<Number>$ = $<Number>1;}
|
||||
|
|
||||
exp_OPENPARENT exp exp_CLOSEPARENT
|
||||
{$<Number>$ = $<Number>2;}
|
||||
exp_NUMBER {
|
||||
$<Number>$ = $<Number>1;
|
||||
}
|
||||
| exp_OPENPARENT exp exp_CLOSEPARENT {
|
||||
$<Number>$ = $<Number>2;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
%%
|
||||
/* End of grammar */
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void cmExprError(yyscan_t yyscanner, const char* message)
|
||||
void cmExpr_yyerror(yyscan_t yyscanner, const char* message)
|
||||
{
|
||||
yyGetParser->Error(message);
|
||||
cmExpr_yyget_extra(yyscanner)->Error(message);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
/* A Bison parser, made by GNU Bison 1.875d. */
|
||||
/* A Bison parser, made by GNU Bison 3.0.4. */
|
||||
|
||||
/* Skeleton parser for Yacc-like parsing with Bison, Copyright (C) 1984,
|
||||
1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
/* Bison interface for Yacc-like parsers in C
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -14,37 +15,53 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* As a special exception, when this file is copied by Bison into a
|
||||
Bison output file, you may use that output file without restriction.
|
||||
This special exception was added by the Free Software Foundation
|
||||
in version 1.24 of Bison. */
|
||||
/* As a special exception, you may create a larger work that contains
|
||||
part or all of the Bison parser skeleton and distribute that work
|
||||
under terms of your choice, so long as that work isn't itself a
|
||||
parser generator using the skeleton or a modified version thereof
|
||||
as a parser skeleton. Alternatively, if you modify or redistribute
|
||||
the parser skeleton itself, you may (at your option) remove this
|
||||
special exception, which will cause the skeleton and the resulting
|
||||
Bison output files to be licensed under the GNU General Public
|
||||
License without this special exception.
|
||||
|
||||
/* Tokens. */
|
||||
This special exception was added by the Free Software Foundation in
|
||||
version 2.2 of Bison. */
|
||||
|
||||
#ifndef YY_CMEXPR_YY_CMEXPRPARSERTOKENS_H_INCLUDED
|
||||
# define YY_CMEXPR_YY_CMEXPRPARSERTOKENS_H_INCLUDED
|
||||
/* Debug traces. */
|
||||
#ifndef YYDEBUG
|
||||
# define YYDEBUG 0
|
||||
#endif
|
||||
#if YYDEBUG
|
||||
extern int cmExpr_yydebug;
|
||||
#endif
|
||||
|
||||
/* Token type. */
|
||||
#ifndef YYTOKENTYPE
|
||||
# define YYTOKENTYPE
|
||||
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||
know about them. */
|
||||
enum yytokentype {
|
||||
exp_PLUS = 258,
|
||||
exp_MINUS = 259,
|
||||
exp_TIMES = 260,
|
||||
exp_DIVIDE = 261,
|
||||
exp_MOD = 262,
|
||||
exp_SHIFTLEFT = 263,
|
||||
exp_SHIFTRIGHT = 264,
|
||||
exp_OPENPARENT = 265,
|
||||
exp_CLOSEPARENT = 266,
|
||||
exp_OR = 267,
|
||||
exp_AND = 268,
|
||||
exp_XOR = 269,
|
||||
exp_NOT = 270,
|
||||
exp_NUMBER = 271
|
||||
};
|
||||
enum yytokentype
|
||||
{
|
||||
exp_PLUS = 258,
|
||||
exp_MINUS = 259,
|
||||
exp_TIMES = 260,
|
||||
exp_DIVIDE = 261,
|
||||
exp_MOD = 262,
|
||||
exp_SHIFTLEFT = 263,
|
||||
exp_SHIFTRIGHT = 264,
|
||||
exp_OPENPARENT = 265,
|
||||
exp_CLOSEPARENT = 266,
|
||||
exp_OR = 267,
|
||||
exp_AND = 268,
|
||||
exp_XOR = 269,
|
||||
exp_NOT = 270,
|
||||
exp_NUMBER = 271
|
||||
};
|
||||
#endif
|
||||
/* Tokens. */
|
||||
#define exp_PLUS 258
|
||||
#define exp_MINUS 259
|
||||
#define exp_TIMES 260
|
||||
@@ -60,17 +77,10 @@
|
||||
#define exp_NOT 270
|
||||
#define exp_NUMBER 271
|
||||
|
||||
/* Value type. */
|
||||
|
||||
|
||||
|
||||
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
|
||||
typedef int YYSTYPE;
|
||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||
# define YYSTYPE_IS_DECLARED 1
|
||||
# define YYSTYPE_IS_TRIVIAL 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
int cmExpr_yyparse (yyscan_t yyscanner);
|
||||
|
||||
#endif /* !YY_CMEXPR_YY_CMEXPRPARSERTOKENS_H_INCLUDED */
|
||||
|
||||
@@ -10,6 +10,9 @@ set(expressions
|
||||
"1 +(3*4) + 10 >> 2"
|
||||
"10000 / 20 / 4"
|
||||
"10000 / (20 / 4)"
|
||||
"-1 + +1"
|
||||
"+1 - -1"
|
||||
"+1 - - + + -(-3 + - - +1)"
|
||||
)
|
||||
|
||||
set(FILE_EXPRESSIONS "")
|
||||
|
||||
Reference in New Issue
Block a user