CMake Nightly Date Stamp
[kiteware-cmake.git] / Source / LexerParser / cmFortranParser.y
blob0b2706048913a0b403d98315a84ef08821c9f56e
1 %{
2 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
3 file Copyright.txt or https://cmake.org/licensing for details. */
4 /*-------------------------------------------------------------------------
5 Portions of this source have been derived from makedepf90 version 2.8.8,
7 Copyright (C) 2000--2006 Erik Edelmann <erik.edelmann@iki.fi>
9 The code was originally distributed under the GPL but permission
10 from the copyright holder has been obtained to distribute this
11 derived work under the CMake license.
12 -------------------------------------------------------------------------*/
16 This file must be translated to C and modified to build everywhere.
18 Run bison like this:
20 bison --name-prefix=cmFortran_yy
21 --defines=cmFortranParserTokens.h
22 -ocmFortranParser.cxx
23 cmFortranParser.y
27 #include "cmConfigure.h" // IWYU pragma: keep
29 #include "cmsys/String.h"
30 #include <stdlib.h>
31 #include <string.h>
33 /*-------------------------------------------------------------------------*/
34 #define cmFortranParser_cxx
35 #include "cmFortranParser.h" /* Interface to parser object. */
37 /* Forward declare the lexer entry point. */
38 YY_DECL;
40 /* Helper function to forward error callback from parser. */
41 static void cmFortran_yyerror(yyscan_t yyscanner, const char* message)
43 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
44 cmFortranParser_Error(parser, message);
47 /* Disable some warnings in the generated code. */
48 #ifdef _MSC_VER
49 # pragma warning (disable: 4102) /* Unused goto label. */
50 # pragma warning (disable: 4065) /* Switch contains default but no case. */
51 # pragma warning (disable: 4701) /* Local variable may not be initialized. */
52 # pragma warning (disable: 4702) /* Unreachable code. */
53 # pragma warning (disable: 4127) /* Conditional expression is constant. */
54 # pragma warning (disable: 4244) /* Conversion to smaller type, data loss. */
55 #endif
56 #if defined(__GNUC__) && __GNUC__ >= 8
57 # pragma GCC diagnostic ignored "-Wconversion"
58 # pragma GCC diagnostic ignored "-Wfree-nonheap-object"
59 #endif
60 #if defined(__clang__) && defined(__has_warning)
61 # if __has_warning("-Wunused-but-set-variable")
62 # pragma clang diagnostic ignored "-Wunused-but-set-variable"
63 # endif
64 #endif
67 /* Generate a reentrant parser object. */
68 %define api.pure
70 /* Configure the parser to use a lexer object. */
71 %lex-param {yyscan_t yyscanner}
72 %parse-param {yyscan_t yyscanner}
74 %define parse.error verbose
76 %union {
77 char* string;
80 /*-------------------------------------------------------------------------*/
81 /* Tokens */
82 %token EOSTMT ASSIGNMENT_OP GARBAGE
83 %token CPP_LINE_DIRECTIVE
84 %token CPP_INCLUDE F90PPR_INCLUDE COCO_INCLUDE
85 %token F90PPR_DEFINE CPP_DEFINE F90PPR_UNDEF CPP_UNDEF
86 %token CPP_IFDEF CPP_IFNDEF CPP_IF CPP_ELSE CPP_ELIF CPP_ENDIF
87 %token F90PPR_IFDEF F90PPR_IFNDEF F90PPR_IF
88 %token F90PPR_ELSE F90PPR_ELIF F90PPR_ENDIF
89 %token COMMA COLON DCOLON LPAREN RPAREN
90 %token <number> UNTERMINATED_STRING
91 %token <string> STRING WORD
92 %token <string> CPP_INCLUDE_ANGLE
93 %token END
94 %token INCLUDE
95 %token INTERFACE
96 %token MODULE
97 %token SUBMODULE
98 %token USE
100 %destructor { free($$); } WORD STRING CPP_INCLUDE_ANGLE
102 /*-------------------------------------------------------------------------*/
103 /* grammar */
106 code: /* empty */ | code stmt;
108 stmt:
109 INTERFACE EOSTMT {
110 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
111 cmFortranParser_SetInInterface(parser, true);
113 | USE WORD other EOSTMT {
114 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
115 cmFortranParser_RuleUse(parser, $2);
116 free($2);
118 | MODULE WORD EOSTMT {
119 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
120 cmFortranParser_RuleModule(parser, $2);
121 free($2);
123 | SUBMODULE LPAREN WORD RPAREN WORD EOSTMT {
124 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
125 cmFortranParser_RuleSubmodule(parser, $3, $5);
126 free($3);
127 free($5);
129 | SUBMODULE LPAREN WORD COLON WORD RPAREN WORD EOSTMT {
130 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
131 cmFortranParser_RuleSubmoduleNested(parser, $3, $5, $7);
132 free($3);
133 free($5);
134 free($7);
136 | INTERFACE WORD EOSTMT {
137 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
138 cmFortranParser_SetInInterface(parser, true);
139 free($2);
141 | END INTERFACE WORD EOSTMT {
142 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
143 cmFortranParser_SetInInterface(parser, false);
144 free($3);
146 | END INTERFACE EOSTMT {
147 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
148 cmFortranParser_SetInInterface(parser, false);
150 | USE DCOLON WORD other EOSTMT {
151 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
152 cmFortranParser_RuleUse(parser, $3);
153 free($3);
155 | USE COMMA WORD DCOLON WORD other EOSTMT {
156 if (cmsysString_strcasecmp($3, "non_intrinsic") == 0) {
157 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
158 cmFortranParser_RuleUse(parser, $5);
160 if (cmsysString_strcasecmp($3, "intrinsic") == 0) {
161 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
162 cmFortranParser_RuleUseIntrinsic(parser, $5);
164 free($3);
165 free($5);
167 | INCLUDE STRING EOSTMT {
168 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
169 cmFortranParser_RuleInclude(parser, $2);
170 free($2);
172 | CPP_LINE_DIRECTIVE STRING other EOSTMT {
173 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
174 cmFortranParser_RuleLineDirective(parser, $2);
175 free($2);
177 | CPP_INCLUDE_ANGLE other EOSTMT {
178 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
179 cmFortranParser_RuleInclude(parser, $1);
180 free($1);
182 | include STRING other EOSTMT {
183 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
184 cmFortranParser_RuleInclude(parser, $2);
185 free($2);
187 | define WORD other EOSTMT {
188 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
189 cmFortranParser_RuleDefine(parser, $2);
190 free($2);
192 | undef WORD other EOSTMT {
193 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
194 cmFortranParser_RuleUndef(parser, $2);
195 free($2);
197 | ifdef WORD other EOSTMT {
198 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
199 cmFortranParser_RuleIfdef(parser, $2);
200 free($2);
202 | ifndef WORD other EOSTMT {
203 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
204 cmFortranParser_RuleIfndef(parser, $2);
205 free($2);
207 | if other EOSTMT {
208 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
209 cmFortranParser_RuleIf(parser);
211 | elif other EOSTMT {
212 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
213 cmFortranParser_RuleElif(parser);
215 | else other EOSTMT {
216 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
217 cmFortranParser_RuleElse(parser);
219 | endif other EOSTMT {
220 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
221 cmFortranParser_RuleEndif(parser);
223 | EOSTMT
224 | error EOSTMT /* tolerate unknown statements until their end */
229 include: CPP_INCLUDE | F90PPR_INCLUDE | COCO_INCLUDE ;
230 define: CPP_DEFINE | F90PPR_DEFINE;
231 undef: CPP_UNDEF | F90PPR_UNDEF ;
232 ifdef: CPP_IFDEF | F90PPR_IFDEF ;
233 ifndef: CPP_IFNDEF | F90PPR_IFNDEF ;
234 if: CPP_IF | F90PPR_IF ;
235 elif: CPP_ELIF | F90PPR_ELIF ;
236 else: CPP_ELSE | F90PPR_ELSE ;
237 endif: CPP_ENDIF | F90PPR_ENDIF ;
238 other: /* empty */ | other misc_code ;
240 misc_code:
241 WORD { free ($1); }
242 | END
243 | INCLUDE
244 | INTERFACE
245 | MODULE
246 | SUBMODULE
247 | USE
248 | STRING { free ($1); }
249 | GARBAGE
250 | ASSIGNMENT_OP
251 | COLON
252 | DCOLON
253 | LPAREN
254 | RPAREN
255 | COMMA
256 | UNTERMINATED_STRING
257 | CPP_LINE_DIRECTIVE
261 /* End of grammar */