CMake/Source/cmCommandArgumentParser.y

241 lines
4.8 KiB
Plaintext
Raw Normal View History

2005-06-08 18:41:05 +04:00
%{
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
2005-06-08 18:41:05 +04:00
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
2005-06-08 18:41:05 +04:00
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
2005-06-08 18:41:05 +04:00
/*
This file must be translated to C and modified to build everywhere.
Run bison like this:
bison --yacc --name-prefix=cmCommandArgument_yy --defines=cmCommandArgumentParserTokens.h -ocmCommandArgumentParser.cxx cmCommandArgumentParser.y
Modify cmCommandArgumentParser.cxx:
- remove TABs
- remove use of the 'register' storage class specifier
- put header block at top of file
2005-06-08 18:41:05 +04:00
*/
2006-08-23 20:02:30 +04:00
#include "cmStandardIncludes.h"
2005-06-08 18:41:05 +04:00
/* Configure the parser to use a lexer object. */
#define YYPARSE_PARAM yyscanner
#define YYLEX_PARAM yyscanner
#define YYERROR_VERBOSE 1
#define cmCommandArgument_yyerror(x) \
cmCommandArgumentError(yyscanner, x)
#define yyGetParser (cmCommandArgument_yyget_extra(yyscanner))
/* Make sure malloc and free are available on QNX. */
#ifdef __QNX__
# include <malloc.h>
#endif
/* Make sure the parser uses standard memory allocation. The default
generated parser malloc/free declarations do not work on all
platforms. */
#include <stdlib.h>
#define YYMALLOC malloc
#define YYFREE free
2005-06-08 18:41:05 +04:00
/*-------------------------------------------------------------------------*/
#include "cmCommandArgumentParserHelper.h" /* Interface to parser object. */
#include "cmCommandArgumentLexer.h" /* Interface to lexer object. */
#include "cmCommandArgumentParserTokens.h" /* Need YYSTYPE for YY_DECL. */
/* Forward declare the lexer entry point. */
YY_DECL;
/* Internal utility functions. */
static void cmCommandArgumentError(yyscan_t yyscanner, const char* message);
#define YYDEBUG 1
/* Configure the parser to support large input. */
#define YYMAXDEPTH 100000
#define YYINITDEPTH 10000
2005-06-08 18:41:05 +04:00
/* Disable some warnings in the generated code. */
#ifdef _MSC_VER
# pragma warning (disable: 4102) /* Unused goto label. */
# pragma warning (disable: 4065) /* Switch statement contains default but no
case. */
# pragma warning (disable: 4244) /* loss of precision */
# pragma warning (disable: 4702) /* unreachable code */
2005-06-08 18:41:05 +04:00
#endif
%}
/* Generate a reentrant parser object. */
%pure_parser
/*
%union {
char* string;
}
*/
/*-------------------------------------------------------------------------*/
/* Tokens */
%token cal_ENVCURLY
2005-06-08 18:41:05 +04:00
%token cal_NCURLY
%token cal_DCURLY
%token cal_DOLLAR "$"
%token cal_LCURLY "{"
%token cal_RCURLY "}"
2005-06-08 18:41:05 +04:00
%token cal_NAME
%token cal_BSLASH "\\"
2005-06-08 18:41:05 +04:00
%token cal_SYMBOL
%token cal_AT "@"
2005-06-08 18:41:05 +04:00
%token cal_ERROR
2005-06-08 22:18:31 +04:00
%token cal_ATNAME
2005-06-08 18:41:05 +04:00
/*-------------------------------------------------------------------------*/
/* grammar */
%%
Start:
2005-06-13 17:59:48 +04:00
GoalWithOptionalBackSlash
2005-06-08 18:41:05 +04:00
{
$<str>$ = 0;
yyGetParser->SetResult($<str>1);
}
2005-06-13 17:59:48 +04:00
GoalWithOptionalBackSlash:
Goal
2005-06-08 18:41:05 +04:00
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
Goal cal_BSLASH
2005-06-08 18:41:05 +04:00
{
2005-06-13 17:59:48 +04:00
$<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2);
2005-06-08 18:41:05 +04:00
}
2005-06-13 17:59:48 +04:00
Goal:
2005-06-08 18:41:05 +04:00
{
2005-06-13 17:59:48 +04:00
$<str>$ = 0;
2005-06-08 18:41:05 +04:00
}
|
2005-06-13 17:59:48 +04:00
String Goal
2005-06-08 18:41:05 +04:00
{
$<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2);
}
2005-06-13 17:59:48 +04:00
String:
OuterText
2005-06-08 18:41:05 +04:00
{
$<str>$ = $<str>1;
}
|
Variable
{
$<str>$ = $<str>1;
}
2005-06-13 17:59:48 +04:00
OuterText:
2005-06-08 18:41:05 +04:00
cal_NAME
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
cal_AT
2005-06-08 18:41:05 +04:00
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
cal_DOLLAR
2005-06-08 22:18:31 +04:00
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
cal_LCURLY
2005-06-08 22:18:31 +04:00
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
cal_RCURLY
2005-06-08 22:18:31 +04:00
{
$<str>$ = $<str>1;
}
|
2005-06-13 17:59:48 +04:00
cal_SYMBOL
2005-06-08 18:41:05 +04:00
{
$<str>$ = $<str>1;
}
Variable:
cal_ENVCURLY EnvVarName cal_RCURLY
{
$<str>$ = yyGetParser->ExpandSpecialVariable($<str>1,$<str>2);
//std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl;
}
|
2005-06-08 18:41:05 +04:00
cal_NCURLY MultipleIds cal_RCURLY
{
$<str>$ = yyGetParser->ExpandSpecialVariable($<str>1,$<str>2);
2005-06-08 22:18:31 +04:00
//std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl;
2005-06-08 18:41:05 +04:00
}
|
cal_DCURLY MultipleIds cal_RCURLY
{
$<str>$ = yyGetParser->ExpandVariable($<str>2);
2005-06-08 22:18:31 +04:00
//std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl;
2005-06-08 18:41:05 +04:00
}
|
2005-06-08 22:18:31 +04:00
cal_ATNAME
2005-06-08 18:41:05 +04:00
{
$<str>$ = yyGetParser->ExpandVariableForAt($<str>1);
2005-06-08 18:41:05 +04:00
}
EnvVarName:
MultipleIds
{
$<str>$ = $<str>1;
}
|
cal_SYMBOL EnvVarName
{
$<str>$ = $<str>1;
}
2005-06-13 17:59:48 +04:00
MultipleIds:
{
2005-06-13 18:27:05 +04:00
$<str>$ = 0;
2005-06-13 17:59:48 +04:00
}
|
ID MultipleIds
{
$<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2);
}
ID:
cal_NAME
{
$<str>$ = $<str>1;
}
|
Variable
{
$<str>$ = $<str>1;
}
2005-06-08 18:41:05 +04:00
%%
/* End of grammar */
/*--------------------------------------------------------------------------*/
void cmCommandArgumentError(yyscan_t yyscanner, const char* message)
{
yyGetParser->Error(message);
}