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 WORD EOSTMT
{
142 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
143 cmFortranParser_SetInInterface
(parser
, false
);
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);
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);
167 | INCLUDE STRING EOSTMT
{
168 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
169 cmFortranParser_RuleInclude
(parser
, $2);
172 | CPP_LINE_DIRECTIVE STRING other EOSTMT
{
173 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
174 cmFortranParser_RuleLineDirective
(parser
, $2);
177 | CPP_INCLUDE_ANGLE other EOSTMT
{
178 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
179 cmFortranParser_RuleInclude
(parser
, $1);
182 | include STRING other EOSTMT
{
183 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
184 cmFortranParser_RuleInclude
(parser
, $2);
187 | define WORD other EOSTMT
{
188 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
189 cmFortranParser_RuleDefine
(parser
, $2);
192 | undef WORD other EOSTMT
{
193 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
194 cmFortranParser_RuleUndef
(parser
, $2);
197 | ifdef WORD other EOSTMT
{
198 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
199 cmFortranParser_RuleIfdef
(parser
, $2);
202 | ifndef WORD other EOSTMT
{
203 cmFortranParser
* parser
= cmFortran_yyget_extra
(yyscanner
);
204 cmFortranParser_RuleIfndef
(parser
, $2);
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
);
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
;
248 | STRING
{ free
($1); }
256 | UNTERMINATED_STRING