summaryrefslogtreecommitdiffstats
path: root/Source/cmCommandArgumentParser.y
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmCommandArgumentParser.y')
-rw-r--r--Source/cmCommandArgumentParser.y220
1 files changed, 220 insertions, 0 deletions
diff --git a/Source/cmCommandArgumentParser.y b/Source/cmCommandArgumentParser.y
new file mode 100644
index 0000000..05a0674
--- /dev/null
+++ b/Source/cmCommandArgumentParser.y
@@ -0,0 +1,220 @@
+%{
+/*=========================================================================
+
+ 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=cmCommandArgument_yy --defines=cmCommandArgumentParserTokens.h -ocmCommandArgumentParser.cxx cmCommandArgumentParser.y
+
+Modify cmCommandArgumentParser.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 cmCommandArgument_yyerror(x) \
+ cmCommandArgumentError(yyscanner, x)
+#define yyGetParser (cmCommandArgument_yyget_extra(yyscanner))
+
+/*-------------------------------------------------------------------------*/
+#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
+#define YYMAXDEPTH 1000000
+
+
+#define calCheckEmpty(cnt) yyGetParser->CheckEmpty(__LINE__, cnt, yyvsp);
+#define calElementStart(cnt) yyGetParser->PrepareElement(&yyval)
+/* 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
+
+/*
+%union {
+ char* string;
+}
+*/
+
+/*-------------------------------------------------------------------------*/
+/* Tokens */
+%token cal_NCURLY
+%token cal_DCURLY
+%token cal_RCURLY
+%token cal_NAME
+%token cal_SYMBOL
+%token cal_AT
+%token cal_ERROR
+
+/*-------------------------------------------------------------------------*/
+/* grammar */
+%%
+
+
+Start:
+Goal
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = 0;
+ yyGetParser->SetResult($<str>1);
+}
+
+Goal:
+String
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+|
+String Goal
+{
+ calElementStart(2);
+ calCheckEmpty(2);
+ $<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2);
+}
+
+String:
+TextWithRCurly
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+|
+Variable
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+
+MultipleIds:
+{
+ calElementStart(0);
+ calCheckEmpty(0);
+}
+|
+ID MultipleIds
+{
+ calElementStart(2);
+ calCheckEmpty(2);
+ $<str>$ = yyGetParser->CombineUnions($<str>1, $<str>2);
+}
+
+ID:
+Text
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+|
+Variable
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+
+Text:
+cal_NAME
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+|
+cal_SYMBOL
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+
+TextWithRCurly:
+Text
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+|
+cal_RCURLY
+{
+ calElementStart(1);
+ calCheckEmpty(1);
+ $<str>$ = $<str>1;
+}
+
+Variable:
+cal_NCURLY MultipleIds cal_RCURLY
+{
+ calElementStart(3);
+ calCheckEmpty(3);
+ $<str>$ = yyGetParser->ExpandSpecialVariable($<str>1,$<str>2);
+ std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl;
+}
+|
+cal_DCURLY MultipleIds cal_RCURLY
+{
+ calElementStart(3);
+ calCheckEmpty(3);
+ $<str>$ = yyGetParser->ExpandVariable($<str>2);
+ std::cerr << __LINE__ << " here: [" << $<str>1 << "] [" << $<str>2 << "] [" << $<str>3 << "]" << std::endl;
+}
+|
+cal_AT cal_NAME cal_AT
+{
+ calElementStart(3);
+ calCheckEmpty(3);
+ $<str>$ = yyGetParser->ExpandVariable($<str>2);
+}
+
+%%
+/* End of grammar */
+
+/*--------------------------------------------------------------------------*/
+void cmCommandArgumentError(yyscan_t yyscanner, const char* message)
+{
+ yyGetParser->Error(message);
+}
+