%{ /*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. 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. ============================================================================*/ /* 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 */ #include "cmStandardIncludes.h" /* 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 /*-------------------------------------------------------------------------*/ #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 /* 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 */ #endif %} /* Generate a reentrant parser object. */ %pure_parser /* %union { char* string; } */ /*-------------------------------------------------------------------------*/ /* Tokens */ %token cal_ENVCURLY %token cal_NCURLY %token cal_DCURLY %token cal_DOLLAR "$" %token cal_LCURLY "{" %token cal_RCURLY "}" %token cal_NAME %token cal_BSLASH "\\" %token cal_SYMBOL %token cal_AT "@" %token cal_ERROR %token cal_ATNAME /*-------------------------------------------------------------------------*/ /* grammar */ %% Start: GoalWithOptionalBackSlash { $<str>$ = 0; yyGetParser->SetResult($<str>1); } GoalWithOptionalBackSlash: Goal { $<str>$ = $<str>1; } | Goal cal_BSLASH { $<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2); } Goal: { $<str>$ = 0; } | String Goal { $<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2); } String: OuterText { $<str>$ = $<str>1; } | Variable { $<str>$ = $<str>1; } OuterText: cal_NAME { $<str>$ = $<str>1; } | cal_AT { $<str>$ = $<str>1; } | cal_DOLLAR { $<str>$ = $<str>1; } | cal_LCURLY { $<str>$ = $<str>1; } | cal_RCURLY { $<str>$ = $<str>1; } | cal_SYMBOL { $<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; } | cal_NCURLY MultipleIds cal_RCURLY { $<str>$ = yyGetParser->ExpandSpecialVariable($<str>1,$<str>2); //std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl; } | cal_DCURLY MultipleIds cal_RCURLY { $<str>$ = yyGetParser->ExpandVariable($<str>2); //std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl; } | cal_ATNAME { $<str>$ = yyGetParser->ExpandVariableForAt($<str>1); } EnvVarName: MultipleIds { $<str>$ = $<str>1; } | cal_SYMBOL EnvVarName { $<str>$ = $<str>1; } MultipleIds: { $<str>$ = 0; } | ID MultipleIds { $<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2); } ID: cal_NAME { $<str>$ = $<str>1; } | Variable { $<str>$ = $<str>1; } %% /* End of grammar */ /*--------------------------------------------------------------------------*/ void cmCommandArgumentError(yyscan_t yyscanner, const char* message) { yyGetParser->Error(message); }