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.
20 bison --name-prefix=cmFortran_yy
21 --defines=cmFortranParserTokens.h
27 #include "cmConfigure.h" // IWYU pragma: keep
29 #include "cmsys/String.h"
33 /*-------------------------------------------------------------------------*/
34 #define cmFortranParser_cxx
35 #include "cmFortranParser.h" /* Interface to parser object. */
37 /* Forward declare the lexer entry point. */
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. */
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. */
56 #if defined(__GNUC__) && __GNUC__ >= 8
57 # pragma GCC diagnostic ignored "-Wconversion"
58 # pragma GCC diagnostic ignored "-Wfree-nonheap-object"
60 #if defined(__clang__) && defined(__has_warning)
61 # if __has_warning("-Wunused-but-set-variable")
62 # pragma clang diagnostic ignored "-Wunused-but-set-variable"
67 /* Generate a reentrant parser object. */
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
80 /*-------------------------------------------------------------------------*/
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
100 %destructor { free($$); } WORD STRING CPP_INCLUDE_ANGLE
102 /*-------------------------------------------------------------------------*/
106 code: /* empty */ | code stmt;
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);
118 | MODULE WORD EOSTMT {
119 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
120 cmFortranParser_RuleModule(parser, $2);
123 | SUBMODULE LPAREN WORD RPAREN WORD EOSTMT {
124 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
125 cmFortranParser_RuleSubmodule(parser, $3, $5);
129 | SUBMODULE LPAREN WORD COLON WORD RPAREN WORD EOSTMT {
130 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
131 cmFortranParser_RuleSubmoduleNested(parser, $3, $5, $7);
136 | INTERFACE WORD EOSTMT {
137 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
138 cmFortranParser_SetInInterface(parser, true);
141 | END INTERFACE EOSTMT {
142 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
143 cmFortranParser_SetInInterface(parser, false);
145 | USE DCOLON WORD other EOSTMT {
146 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
147 cmFortranParser_RuleUse(parser, $3);
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);
155 if (cmsysString_strcasecmp($3, "intrinsic") == 0) {
156 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
157 cmFortranParser_RuleUseIntrinsic(parser, $5);
162 | INCLUDE STRING EOSTMT {
163 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
164 cmFortranParser_RuleInclude(parser, $2);
167 | CPP_LINE_DIRECTIVE STRING other EOSTMT {
168 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
169 cmFortranParser_RuleLineDirective(parser, $2);
172 | CPP_INCLUDE_ANGLE other EOSTMT {
173 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
174 cmFortranParser_RuleInclude(parser, $1);
177 | include STRING other EOSTMT {
178 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
179 cmFortranParser_RuleInclude(parser, $2);
182 | define WORD other EOSTMT {
183 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
184 cmFortranParser_RuleDefine(parser, $2);
187 | undef WORD other EOSTMT {
188 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
189 cmFortranParser_RuleUndef(parser, $2);
192 | ifdef WORD other EOSTMT {
193 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
194 cmFortranParser_RuleIfdef(parser, $2);
197 | ifndef WORD other EOSTMT {
198 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
199 cmFortranParser_RuleIfndef(parser, $2);
203 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
204 cmFortranParser_RuleIf(parser);
206 | elif other EOSTMT {
207 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
208 cmFortranParser_RuleElif(parser);
210 | else other EOSTMT {
211 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
212 cmFortranParser_RuleElse(parser);
214 | endif other EOSTMT {
215 cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
216 cmFortranParser_RuleEndif(parser);
219 | error EOSTMT /* tolerate unknown statements until their end */
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 ;
243 | STRING { free ($1); }
251 | UNTERMINATED_STRING