Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Source / LexerParser / cmFortranParser.y
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,
6
7    Copyright (C) 2000--2006 Erik Edelmann <erik.edelmann@iki.fi>
8
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 -------------------------------------------------------------------------*/
13
14 /*
15
16 This file must be translated to C and modified to build everywhere.
17
18 Run bison like this:
19
20   bison --name-prefix=cmFortran_yy
21         --defines=cmFortranParserTokens.h
22          -ocmFortranParser.cxx
23           cmFortranParser.y
24
25 */
26
27 #include "cmConfigure.h" // IWYU pragma: keep
28
29 #include "cmsys/String.h"
30 #include <stdlib.h>
31 #include <string.h>
32
33 /*-------------------------------------------------------------------------*/
34 #define cmFortranParser_cxx
35 #include "cmFortranParser.h" /* Interface to parser object.  */
36
37 /* Forward declare the lexer entry point.  */
38 YY_DECL;
39
40 /* Helper function to forward error callback from parser.  */
41 static void cmFortran_yyerror(yyscan_t yyscanner, const char* message)
42 {
43   cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
44   cmFortranParser_Error(parser, message);
45 }
46
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
65 %}
66
67 /* Generate a reentrant parser object.  */
68 %define api.pure
69
70 /* Configure the parser to use a lexer object.  */
71 %lex-param   {yyscan_t yyscanner}
72 %parse-param {yyscan_t yyscanner}
73
74 %define parse.error verbose
75
76 %union {
77   char* string;
78 }
79
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
99
100 %destructor { free($$); } WORD STRING CPP_INCLUDE_ANGLE
101
102 /*-------------------------------------------------------------------------*/
103 /* grammar */
104 %%
105
106 code: /* empty */ | code stmt;
107
108 stmt:
109   INTERFACE EOSTMT {
110     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
111     cmFortranParser_SetInInterface(parser, true);
112   }
113 | USE WORD other EOSTMT {
114     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
115     cmFortranParser_RuleUse(parser, $2);
116     free($2);
117   }
118 | MODULE WORD EOSTMT {
119     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
120     cmFortranParser_RuleModule(parser, $2);
121     free($2);
122   }
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);
128   }
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);
135   }
136 | INTERFACE WORD EOSTMT {
137     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
138     cmFortranParser_SetInInterface(parser, true);
139     free($2);
140   }
141 | END INTERFACE EOSTMT {
142     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
143     cmFortranParser_SetInInterface(parser, false);
144   }
145 | USE DCOLON WORD other EOSTMT {
146     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
147     cmFortranParser_RuleUse(parser, $3);
148     free($3);
149   }
150 | USE COMMA WORD DCOLON WORD other EOSTMT {
151     if (cmsysString_strcasecmp($3, "non_intrinsic") == 0) {
152       cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
153       cmFortranParser_RuleUse(parser, $5);
154     }
155     if (cmsysString_strcasecmp($3, "intrinsic") == 0) {
156       cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
157       cmFortranParser_RuleUseIntrinsic(parser, $5);
158     }
159     free($3);
160     free($5);
161   }
162 | INCLUDE STRING EOSTMT {
163     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
164     cmFortranParser_RuleInclude(parser, $2);
165     free($2);
166   }
167 | CPP_LINE_DIRECTIVE STRING other EOSTMT {
168     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
169     cmFortranParser_RuleLineDirective(parser, $2);
170     free($2);
171   }
172 | CPP_INCLUDE_ANGLE other EOSTMT {
173     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
174     cmFortranParser_RuleInclude(parser, $1);
175     free($1);
176   }
177 | include STRING other EOSTMT {
178     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
179     cmFortranParser_RuleInclude(parser, $2);
180     free($2);
181   }
182 | define WORD other EOSTMT {
183     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
184     cmFortranParser_RuleDefine(parser, $2);
185     free($2);
186   }
187 | undef WORD other EOSTMT {
188     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
189     cmFortranParser_RuleUndef(parser, $2);
190     free($2);
191   }
192 | ifdef WORD other EOSTMT {
193     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
194     cmFortranParser_RuleIfdef(parser, $2);
195     free($2);
196   }
197 | ifndef WORD other EOSTMT {
198     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
199     cmFortranParser_RuleIfndef(parser, $2);
200     free($2);
201   }
202 | if other EOSTMT {
203     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
204     cmFortranParser_RuleIf(parser);
205   }
206 | elif other EOSTMT {
207     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
208     cmFortranParser_RuleElif(parser);
209   }
210 | else other EOSTMT {
211     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
212     cmFortranParser_RuleElse(parser);
213   }
214 | endif other EOSTMT {
215     cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
216     cmFortranParser_RuleEndif(parser);
217   }
218 | EOSTMT
219 | error EOSTMT /* tolerate unknown statements until their end */
220 ;
221
222
223
224 include: CPP_INCLUDE | F90PPR_INCLUDE | COCO_INCLUDE ;
225 define: CPP_DEFINE | F90PPR_DEFINE;
226 undef: CPP_UNDEF | F90PPR_UNDEF ;
227 ifdef: CPP_IFDEF | F90PPR_IFDEF ;
228 ifndef: CPP_IFNDEF | F90PPR_IFNDEF ;
229 if: CPP_IF | F90PPR_IF ;
230 elif: CPP_ELIF | F90PPR_ELIF ;
231 else: CPP_ELSE | F90PPR_ELSE ;
232 endif: CPP_ENDIF | F90PPR_ENDIF ;
233 other: /* empty */ | other misc_code ;
234
235 misc_code:
236   WORD                { free ($1); }
237 | END
238 | INCLUDE
239 | INTERFACE
240 | MODULE
241 | SUBMODULE
242 | USE
243 | STRING              { free ($1); }
244 | GARBAGE
245 | ASSIGNMENT_OP
246 | COLON
247 | DCOLON
248 | LPAREN
249 | RPAREN
250 | COMMA
251 | UNTERMINATED_STRING
252 | CPP_LINE_DIRECTIVE
253 ;
254
255 %%
256 /* End of grammar */