Merge topic 'fortran-depend-cleanup'

d28da906 cmFortranParser: Inject a newline at end-of-file when missing
8c65a501 cmFortranParser: Revise indentation style to match rest of CMake
f70c71c5 cmFortranLexer: Update to flex 2.6
e11cd31f Fortran: Warn when dependency scanning fails to parse a source file
This commit is contained in:
Brad King 2016-09-08 09:36:57 -04:00 committed by CMake Topic Stage
commit f506489d1e
10 changed files with 1196 additions and 1270 deletions

View File

@ -3,3 +3,5 @@ cm_sha2.* whitespace=indent-with-non-tab
# Preserve indentation style in generated code.
cmListFileLexer.c whitespace=-tab-in-indent,-indent-with-non-tab
cmFortranLexer.cxx whitespace=-tab-in-indent,-indent-with-non-tab
cmFortranLexer.h whitespace=-tab-in-indent,-indent-with-non-tab

View File

@ -130,6 +130,12 @@ bool cmDependsFortran::WriteDependencies(const std::set<std::string>& sources,
if (cmFortran_yyparse(parser.Scanner) != 0) {
// Failed to parse the file. Report failure to write dependencies.
okay = false;
/* clang-format off */
std::cerr <<
"warning: failed to parse dependencies from Fortran source "
"'" << src << "': " << parser.Error << std::endl
;
/* clang-format on */
}
}
return okay;

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +1,19 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2015 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#ifndef cmFortran_yyHEADER_H
#define cmFortran_yyHEADER_H 1
#define cmFortran_yyIN_HEADER 1
#line 6 "cmFortranLexer.h"
#line 8 "cmFortranLexer.h"
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 39
#define YY_FLEX_MINOR_VERSION 6
#define YY_FLEX_SUBMINOR_VERSION 1
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@ -99,25 +92,13 @@ typedef unsigned int flex_uint32_t;
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST
#else /* ! __cplusplus */
/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* defined (__STDC__) */
#endif /* ! __cplusplus */
#ifdef YY_USE_CONST
/* TODO: this is always defined, so inline it */
#define yyconst const
#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yyconst
#define yynoreturn
#endif
/* An opaque pointer. */
@ -163,52 +144,52 @@ typedef size_t yy_size_t;
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
{
FILE *yy_input_file;
char *yy_ch_buf; /* input buffer */
char *yy_buf_pos; /* current position in input buffer */
char *yy_ch_buf; /* input buffer */
char *yy_buf_pos; /* current position in input buffer */
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
yy_size_t yy_buf_size;
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
int yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
yy_size_t yy_n_chars;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*/
int yy_is_our_buffer;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*/
int yy_is_our_buffer;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input after
* each newline.
*/
int yy_is_interactive;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input after
* each newline.
*/
int yy_is_interactive;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*/
int yy_at_bol;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*/
int yy_at_bol;
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
int yy_buffer_status;
int yy_buffer_status;
};
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
void cmFortran_yyrestart (FILE *input_file ,yyscan_t yyscanner );
@ -221,7 +202,7 @@ void cmFortran_yypop_buffer_state (yyscan_t yyscanner );
YY_BUFFER_STATE cmFortran_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE cmFortran_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE cmFortran_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
YY_BUFFER_STATE cmFortran_yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
void *cmFortran_yyalloc (yy_size_t ,yyscan_t yyscanner );
void *cmFortran_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
@ -229,7 +210,7 @@ void cmFortran_yyfree (void * ,yyscan_t yyscanner );
/* Begin user sect3 */
#define cmFortran_yywrap(yyscanner) 1
#define cmFortran_yywrap(yyscanner) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
#define yytext_ptr yytext_r
@ -243,6 +224,14 @@ void cmFortran_yyfree (void * ,yyscan_t yyscanner );
#endif
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
* down here because we want the user's section 1 to have been scanned first.
* The user has a chance to override it with an option.
*/
#include <unistd.h>
#endif
#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif
@ -266,23 +255,23 @@ void cmFortran_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
FILE *cmFortran_yyget_in (yyscan_t yyscanner );
void cmFortran_yyset_in (FILE * in_str ,yyscan_t yyscanner );
void cmFortran_yyset_in (FILE * _in_str ,yyscan_t yyscanner );
FILE *cmFortran_yyget_out (yyscan_t yyscanner );
void cmFortran_yyset_out (FILE * out_str ,yyscan_t yyscanner );
void cmFortran_yyset_out (FILE * _out_str ,yyscan_t yyscanner );
yy_size_t cmFortran_yyget_leng (yyscan_t yyscanner );
int cmFortran_yyget_leng (yyscan_t yyscanner );
char *cmFortran_yyget_text (yyscan_t yyscanner );
int cmFortran_yyget_lineno (yyscan_t yyscanner );
void cmFortran_yyset_lineno (int line_number ,yyscan_t yyscanner );
void cmFortran_yyset_lineno (int _line_number ,yyscan_t yyscanner );
int cmFortran_yyget_column (yyscan_t yyscanner );
void cmFortran_yyset_column (int column_no ,yyscan_t yyscanner );
void cmFortran_yyset_column (int _column_no ,yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@ -348,5 +337,9 @@ extern int cmFortran_yylex (yyscan_t yyscanner);
#undef YY_DECL
#endif
#line 176 "cmFortranLexer.in.l"
#line 344 "cmFortranLexer.h"
#undef cmFortran_yyIN_HEADER
#endif /* cmFortran_yyHEADER_H */

View File

@ -24,28 +24,21 @@
This file must be translated to C and modified to build everywhere.
Run flex like this:
Run flex >= 2.6 like this:
flex -i --prefix=cmFortran_yy --header-file=cmFortranLexer.h -ocmFortranLexer.cxx cmFortranLexer.in.l
Modify cmFortranLexer.cxx:
- remove TABs
- remove use of the 'register' storage class specifier
- remove "yyscanner" argument from these methods:
yy_fatal_error, cmFortran_yyalloc, cmFortran_yyrealloc, cmFortran_yyfree
- remove trailing whitespace: sed -i 's/\s*$//' cmFortranLexer.h cmFortranLexer.cxx
- remove blank lines at end of file
- remove "yyscanner = NULL" from end of cmFortran_yylex_destroy
- remove all YY_BREAK lines occurring right after return statements
- change while ( 1 ) to for(;;)
Modify cmFortranLexer.h:
- remove TABs
- remove the yy_init_globals function
- remove the block that includes unistd.h
- remove #line directives (avoids bogus warning on old Sun)
- add cast in yy_scan_bytes for loop condition of _yybytes_len to size_t
*/
#include "cmStandardLexer.h"
#undef YY_NO_UNPUT
#define cmFortranLexer_cxx
#include "cmFortranParser.h" /* Interface to parser object. */

View File

@ -1,8 +1,8 @@
/* A Bison parser, made by GNU Bison 3.0.2. */
/* A Bison parser, made by GNU Bison 3.0.4. */
/* Bison implementation for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -44,7 +44,7 @@
#define YYBISON 1
/* Bison version. */
#define YYBISON_VERSION "3.0.2"
#define YYBISON_VERSION "3.0.4"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@ -199,11 +199,10 @@ extern int cmFortran_yydebug;
F90PPR_ENDIF = 280,
COMMA = 281,
DCOLON = 282,
CPP_TOENDL = 283,
UNTERMINATED_STRING = 284,
STRING = 285,
WORD = 286,
CPP_INCLUDE_ANGLE = 287
UNTERMINATED_STRING = 283,
STRING = 284,
WORD = 285,
CPP_INCLUDE_ANGLE = 286
};
#endif
/* Tokens. */
@ -232,23 +231,24 @@ extern int cmFortran_yydebug;
#define F90PPR_ENDIF 280
#define COMMA 281
#define DCOLON 282
#define CPP_TOENDL 283
#define UNTERMINATED_STRING 284
#define STRING 285
#define WORD 286
#define CPP_INCLUDE_ANGLE 287
#define UNTERMINATED_STRING 283
#define STRING 284
#define WORD 285
#define CPP_INCLUDE_ANGLE 286
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE YYSTYPE;
union YYSTYPE
{
#line 81 "cmFortranParser.y" /* yacc.c:355 */
char* string;
#line 251 "cmFortranParser.cxx" /* yacc.c:355 */
#line 249 "cmFortranParser.cxx" /* yacc.c:355 */
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif
@ -503,10 +503,10 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
#define YYLAST 290
#define YYLAST 249
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 33
#define YYNTOKENS 32
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 16
/* YYNRULES -- Number of rules. */
@ -517,7 +517,7 @@ union yyalloc
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
#define YYMAXUTOK 287
#define YYMAXUTOK 286
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@ -554,19 +554,19 @@ static const yytype_uint8 yytranslate[] =
2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32
25, 26, 27, 28, 29, 30, 31
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
static const yytype_uint8 yyrline[] =
{
0, 104, 104, 104, 106, 106, 108, 114, 124, 154,
165, 178, 189, 196, 203, 210, 216, 222, 228, 234,
239, 244, 249, 254, 258, 259, 260, 265, 265, 265,
266, 266, 267, 267, 268, 268, 269, 269, 270, 270,
271, 271, 272, 272, 273, 273, 274, 274, 277, 278,
279, 280, 281, 282, 283
0, 103, 103, 103, 105, 105, 108, 113, 120, 138,
146, 156, 164, 169, 174, 179, 184, 189, 194, 199,
203, 207, 211, 215, 218, 219, 220, 225, 225, 225,
226, 226, 227, 227, 228, 228, 229, 229, 230, 230,
231, 231, 232, 232, 233, 233, 234, 234, 237, 238,
239, 240, 241, 242, 243
};
#endif
@ -580,11 +580,10 @@ static const char *const yytname[] =
"F90PPR_DEFINE", "CPP_DEFINE", "F90PPR_UNDEF", "CPP_UNDEF", "CPP_IFDEF",
"CPP_IFNDEF", "CPP_IF", "CPP_ELSE", "CPP_ELIF", "CPP_ENDIF",
"F90PPR_IFDEF", "F90PPR_IFNDEF", "F90PPR_IF", "F90PPR_ELSE",
"F90PPR_ELIF", "F90PPR_ENDIF", "COMMA", "DCOLON", "CPP_TOENDL",
"UNTERMINATED_STRING", "STRING", "WORD", "CPP_INCLUDE_ANGLE", "$accept",
"code", "stmt", "assignment_stmt", "keyword_stmt", "include", "define",
"undef", "ifdef", "ifndef", "if", "elif", "else", "endif", "other",
"misc_code", YY_NULLPTR
"F90PPR_ELIF", "F90PPR_ENDIF", "COMMA", "DCOLON", "UNTERMINATED_STRING",
"STRING", "WORD", "CPP_INCLUDE_ANGLE", "$accept", "code", "stmt",
"assignment_stmt", "keyword_stmt", "include", "define", "undef", "ifdef",
"ifndef", "if", "elif", "else", "endif", "other", "misc_code", YY_NULLPTR
};
#endif
@ -596,14 +595,14 @@ static const yytype_uint16 yytoknum[] =
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
285, 286, 287
285, 286
};
# endif
#define YYPACT_NINF -30
#define YYPACT_NINF -29
#define yypact_value_is_default(Yystate) \
(!!((Yystate) == (-30)))
(!!((Yystate) == (-29)))
#define YYTABLE_NINF -1
@ -614,17 +613,17 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int16 yypact[] =
{
-30, 41, -30, -30, -30, -30, -29, -30, -30, -30,
-30, -30, -30, -30, -30, -30, -30, -30, -30, -30,
-30, -30, -30, -30, -30, -30, 259, -30, -30, -30,
-30, -28, -23, -18, -16, -13, -30, -30, -30, -30,
2, -30, -30, -30, -30, -12, -9, -30, -30, 64,
-30, -30, -30, -30, -30, 71, 77, 83, 112, -30,
-30, -30, -30, -30, -30, -30, -30, -30, 118, 124,
130, -24, -30, 159, 165, -30, 171, 177, 206, 212,
218, -30, -30, -30, -30, -30, -30, -30, -1, 224,
-30, -30, -30, -30, -30, -30, -30, -30, -30, 253,
-30
-29, 41, -29, -29, -29, -29, -28, -29, -29, -29,
-29, -29, -29, -29, -29, -29, -29, -29, -29, -29,
-29, -29, -29, -29, -29, -29, 219, -29, -29, -29,
-29, -26, -22, -17, -15, -12, -29, -29, -29, -29,
2, -29, -29, -29, -29, -11, -8, -29, -29, 64,
-29, -29, -29, -29, -29, 70, 75, 80, 108, -29,
-29, -29, -29, -29, -29, -29, -29, -29, 113, 118,
123, -25, -29, 128, 156, -29, 161, 166, 171, 176,
204, -29, -29, -29, -29, -29, -29, -29, 3, 209,
-29, -29, -29, -29, -29, -29, -29, -29, -29, 214,
-29
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@ -648,8 +647,8 @@ static const yytype_uint8 yydefact[] =
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int8 yypgoto[] =
{
-30, -30, -30, -30, -30, -30, -30, -30, -30, -30,
-30, -30, -30, -30, -27, -30
-29, -29, -29, -29, -29, -29, -29, -29, -29, -29,
-29, -29, -29, -29, -27, -29
};
/* YYDEFGOTO[NTERM-NUM]. */
@ -664,98 +663,88 @@ static const yytype_int8 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_uint8 yytable[] =
{
49, 41, 50, 88, 0, 59, 60, 61, 51, 55,
49, 41, 88, 50, 0, 59, 60, 61, 51, 55,
56, 57, 58, 52, 68, 53, 69, 70, 54, 71,
73, 74, 72, 76, 77, 78, 79, 80, 62, 63,
97, 64, 65, 66, 0, 0, 0, 0, 0, 0,
64, 65, 66, 97, 0, 0, 0, 0, 0, 0,
0, 2, 3, 0, 4, 89, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 75, 60, 61,
99, 0, 26, 27, 81, 60, 61, 0, 0, 0,
82, 60, 61, 0, 0, 0, 83, 60, 61, 0,
62, 63, 0, 64, 65, 66, 0, 62, 63, 0,
64, 65, 66, 62, 63, 0, 64, 65, 66, 62,
63, 0, 64, 65, 66, 84, 60, 61, 0, 0,
0, 85, 60, 61, 0, 0, 0, 86, 60, 61,
0, 0, 0, 87, 60, 61, 0, 0, 62, 63,
0, 64, 65, 66, 62, 63, 0, 64, 65, 66,
62, 63, 0, 64, 65, 66, 62, 63, 0, 64,
65, 66, 90, 60, 61, 0, 0, 0, 91, 60,
61, 0, 0, 0, 92, 60, 61, 0, 0, 0,
93, 60, 61, 0, 0, 62, 63, 0, 64, 65,
66, 62, 63, 0, 64, 65, 66, 62, 63, 0,
64, 65, 66, 62, 63, 0, 64, 65, 66, 94,
60, 61, 0, 0, 0, 95, 60, 61, 0, 0,
0, 96, 60, 61, 0, 0, 0, 98, 60, 61,
0, 0, 62, 63, 0, 64, 65, 66, 62, 63,
0, 64, 65, 66, 62, 63, 0, 64, 65, 66,
62, 63, 0, 64, 65, 66, 100, 60, 61, 0,
99, 26, 27, 81, 60, 61, 0, 0, 82, 60,
61, 0, 0, 83, 60, 61, 0, 0, 0, 0,
62, 63, 64, 65, 66, 0, 62, 63, 64, 65,
66, 62, 63, 64, 65, 66, 62, 63, 64, 65,
66, 84, 60, 61, 0, 0, 85, 60, 61, 0,
0, 86, 60, 61, 0, 0, 87, 60, 61, 0,
0, 90, 60, 61, 62, 63, 64, 65, 66, 62,
63, 64, 65, 66, 62, 63, 64, 65, 66, 62,
63, 64, 65, 66, 62, 63, 64, 65, 66, 91,
60, 61, 0, 0, 92, 60, 61, 0, 0, 93,
60, 61, 0, 0, 94, 60, 61, 0, 0, 95,
60, 61, 62, 63, 64, 65, 66, 62, 63, 64,
65, 66, 62, 63, 64, 65, 66, 62, 63, 64,
65, 66, 62, 63, 64, 65, 66, 96, 60, 61,
0, 0, 98, 60, 61, 0, 0, 100, 60, 61,
0, 0, 42, 43, 44, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 62,
63, 0, 64, 65, 66, 45, 46, 0, 0, 47,
48
62, 63, 64, 65, 66, 62, 63, 64, 65, 66,
62, 63, 64, 65, 66, 45, 46, 0, 47, 48
};
static const yytype_int8 yycheck[] =
{
27, 30, 30, 27, -1, 3, 4, 5, 31, 36,
37, 38, 39, 31, 41, 31, 43, 44, 31, 31,
47, 48, 31, 50, 51, 52, 53, 54, 26, 27,
31, 29, 30, 31, -1, -1, -1, -1, -1, -1,
27, 29, 27, 29, -1, 3, 4, 5, 30, 36,
37, 38, 39, 30, 41, 30, 43, 44, 30, 30,
47, 48, 30, 50, 51, 52, 53, 54, 26, 27,
28, 29, 30, 30, -1, -1, -1, -1, -1, -1,
-1, 0, 1, -1, 3, 72, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 3, 4, 5,
97, -1, 31, 32, 3, 4, 5, -1, -1, -1,
3, 4, 5, -1, -1, -1, 3, 4, 5, -1,
26, 27, -1, 29, 30, 31, -1, 26, 27, -1,
29, 30, 31, 26, 27, -1, 29, 30, 31, 26,
27, -1, 29, 30, 31, 3, 4, 5, -1, -1,
-1, 3, 4, 5, -1, -1, -1, 3, 4, 5,
-1, -1, -1, 3, 4, 5, -1, -1, 26, 27,
-1, 29, 30, 31, 26, 27, -1, 29, 30, 31,
26, 27, -1, 29, 30, 31, 26, 27, -1, 29,
30, 31, 3, 4, 5, -1, -1, -1, 3, 4,
5, -1, -1, -1, 3, 4, 5, -1, -1, -1,
3, 4, 5, -1, -1, 26, 27, -1, 29, 30,
31, 26, 27, -1, 29, 30, 31, 26, 27, -1,
29, 30, 31, 26, 27, -1, 29, 30, 31, 3,
4, 5, -1, -1, -1, 3, 4, 5, -1, -1,
-1, 3, 4, 5, -1, -1, -1, 3, 4, 5,
-1, -1, 26, 27, -1, 29, 30, 31, 26, 27,
-1, 29, 30, 31, 26, 27, -1, 29, 30, 31,
26, 27, -1, 29, 30, 31, 3, 4, 5, -1,
97, 30, 31, 3, 4, 5, -1, -1, 3, 4,
5, -1, -1, 3, 4, 5, -1, -1, -1, -1,
26, 27, 28, 29, 30, -1, 26, 27, 28, 29,
30, 26, 27, 28, 29, 30, 26, 27, 28, 29,
30, 3, 4, 5, -1, -1, 3, 4, 5, -1,
-1, 3, 4, 5, -1, -1, 3, 4, 5, -1,
-1, 3, 4, 5, 26, 27, 28, 29, 30, 26,
27, 28, 29, 30, 26, 27, 28, 29, 30, 26,
27, 28, 29, 30, 26, 27, 28, 29, 30, 3,
4, 5, -1, -1, 3, 4, 5, -1, -1, 3,
4, 5, -1, -1, 3, 4, 5, -1, -1, 3,
4, 5, 26, 27, 28, 29, 30, 26, 27, 28,
29, 30, 26, 27, 28, 29, 30, 26, 27, 28,
29, 30, 26, 27, 28, 29, 30, 3, 4, 5,
-1, -1, 3, 4, 5, -1, -1, 3, 4, 5,
-1, -1, 3, 4, 5, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 26,
27, -1, 29, 30, 31, 26, 27, -1, -1, 30,
31
26, 27, 28, 29, 30, 26, 27, 28, 29, 30,
26, 27, 28, 29, 30, 26, 27, -1, 29, 30
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
0, 34, 0, 1, 3, 5, 6, 7, 8, 9,
0, 33, 0, 1, 3, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 31, 32, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 30, 3, 4, 5, 26, 27, 30, 31, 47,
30, 31, 31, 31, 31, 47, 47, 47, 47, 3,
4, 5, 26, 27, 29, 30, 31, 48, 47, 47,
47, 31, 31, 47, 47, 3, 47, 47, 47, 47,
47, 3, 3, 3, 3, 3, 3, 3, 27, 47,
3, 3, 3, 3, 3, 3, 3, 31, 3, 47,
20, 21, 22, 23, 24, 25, 30, 31, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 29, 3, 4, 5, 26, 27, 29, 30, 46,
29, 30, 30, 30, 30, 46, 46, 46, 46, 3,
4, 5, 26, 27, 28, 29, 30, 47, 46, 46,
46, 30, 30, 46, 46, 3, 46, 46, 46, 46,
46, 3, 3, 3, 3, 3, 3, 3, 27, 46,
3, 3, 3, 3, 3, 3, 3, 30, 3, 46,
3
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint8 yyr1[] =
{
0, 33, 34, 34, 35, 35, 36, 37, 37, 37,
37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
37, 37, 37, 37, 37, 37, 37, 38, 38, 38,
39, 39, 40, 40, 41, 41, 42, 42, 43, 43,
44, 44, 45, 45, 46, 46, 47, 47, 48, 48,
48, 48, 48, 48, 48
0, 32, 33, 33, 34, 34, 35, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 37, 37, 37,
38, 38, 39, 39, 40, 40, 41, 41, 42, 42,
43, 43, 44, 44, 45, 45, 46, 46, 47, 47,
47, 47, 47, 47, 47
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@ -1449,239 +1438,217 @@ yyreduce:
switch (yyn)
{
case 6:
#line 109 "cmFortranParser.y" /* yacc.c:1646 */
#line 108 "cmFortranParser.y" /* yacc.c:1646 */
{
free((yyvsp[-3].string));
}
#line 1457 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1446 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 7:
#line 115 "cmFortranParser.y" /* yacc.c:1646 */
#line 113 "cmFortranParser.y" /* yacc.c:1646 */
{
if (cmFortranParserIsKeyword((yyvsp[-1].string), "interface"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
if (cmFortranParserIsKeyword((yyvsp[-1].string), "interface")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, true);
}
free((yyvsp[-1].string));
}
#line 1471 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1458 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 8:
#line 125 "cmFortranParser.y" /* yacc.c:1646 */
#line 120 "cmFortranParser.y" /* yacc.c:1646 */
{
if (cmFortranParserIsKeyword((yyvsp[-3].string), "use"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
if (cmFortranParserIsKeyword((yyvsp[-3].string), "use")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, (yyvsp[-2].string));
}
else if (cmFortranParserIsKeyword((yyvsp[-3].string), "module"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword((yyvsp[-3].string), "module")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleModule(parser, (yyvsp[-2].string));
}
else if (cmFortranParserIsKeyword((yyvsp[-3].string), "interface"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword((yyvsp[-3].string), "interface")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, true);
}
else if (cmFortranParserIsKeyword((yyvsp[-2].string), "interface") &&
cmFortranParserIsKeyword((yyvsp[-3].string), "end"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword((yyvsp[-2].string), "interface") &&
cmFortranParserIsKeyword((yyvsp[-3].string), "end")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, false);
}
}
free((yyvsp[-3].string));
free((yyvsp[-2].string));
}
#line 1505 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1481 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 9:
#line 155 "cmFortranParser.y" /* yacc.c:1646 */
#line 138 "cmFortranParser.y" /* yacc.c:1646 */
{
if (cmFortranParserIsKeyword((yyvsp[-4].string), "use"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
if (cmFortranParserIsKeyword((yyvsp[-4].string), "use")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, (yyvsp[-2].string));
}
}
free((yyvsp[-4].string));
free((yyvsp[-2].string));
}
#line 1520 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1494 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 10:
#line 166 "cmFortranParser.y" /* yacc.c:1646 */
#line 146 "cmFortranParser.y" /* yacc.c:1646 */
{
if (cmFortranParserIsKeyword((yyvsp[-6].string), "use") &&
cmFortranParserIsKeyword((yyvsp[-4].string), "non_intrinsic") )
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
cmFortranParserIsKeyword((yyvsp[-4].string), "non_intrinsic") ) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, (yyvsp[-2].string));
}
}
free((yyvsp[-6].string));
free((yyvsp[-4].string));
free((yyvsp[-2].string));
}
#line 1537 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1509 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 11:
#line 179 "cmFortranParser.y" /* yacc.c:1646 */
#line 156 "cmFortranParser.y" /* yacc.c:1646 */
{
if (cmFortranParserIsKeyword((yyvsp[-3].string), "include"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
if (cmFortranParserIsKeyword((yyvsp[-3].string), "include")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, (yyvsp[-2].string));
}
}
free((yyvsp[-3].string));
free((yyvsp[-2].string));
}
#line 1552 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1522 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 12:
#line 190 "cmFortranParser.y" /* yacc.c:1646 */
#line 164 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleLineDirective(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1563 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1532 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 13:
#line 197 "cmFortranParser.y" /* yacc.c:1646 */
#line 169 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1574 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1542 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 14:
#line 204 "cmFortranParser.y" /* yacc.c:1646 */
#line 174 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1585 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1552 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 15:
#line 211 "cmFortranParser.y" /* yacc.c:1646 */
#line 179 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleDefine(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1595 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1562 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 16:
#line 217 "cmFortranParser.y" /* yacc.c:1646 */
#line 184 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUndef(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1605 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1572 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 17:
#line 223 "cmFortranParser.y" /* yacc.c:1646 */
#line 189 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIfdef(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1615 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1582 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 18:
#line 229 "cmFortranParser.y" /* yacc.c:1646 */
#line 194 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIfndef(parser, (yyvsp[-2].string));
free((yyvsp[-2].string));
}
#line 1625 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1592 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 19:
#line 235 "cmFortranParser.y" /* yacc.c:1646 */
#line 199 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIf(parser);
}
#line 1634 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1601 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 20:
#line 240 "cmFortranParser.y" /* yacc.c:1646 */
#line 203 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleElif(parser);
}
#line 1643 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1610 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 21:
#line 245 "cmFortranParser.y" /* yacc.c:1646 */
#line 207 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleElse(parser);
}
#line 1652 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1619 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 22:
#line 250 "cmFortranParser.y" /* yacc.c:1646 */
#line 211 "cmFortranParser.y" /* yacc.c:1646 */
{
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleEndif(parser);
}
#line 1661 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1628 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 23:
#line 255 "cmFortranParser.y" /* yacc.c:1646 */
#line 215 "cmFortranParser.y" /* yacc.c:1646 */
{
free((yyvsp[-3].string));
}
#line 1669 "cmFortranParser.cxx" /* yacc.c:1646 */
}
#line 1636 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 48:
#line 277 "cmFortranParser.y" /* yacc.c:1646 */
#line 237 "cmFortranParser.y" /* yacc.c:1646 */
{ free ((yyvsp[0].string)); }
#line 1675 "cmFortranParser.cxx" /* yacc.c:1646 */
#line 1642 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
case 49:
#line 278 "cmFortranParser.y" /* yacc.c:1646 */
#line 238 "cmFortranParser.y" /* yacc.c:1646 */
{ free ((yyvsp[0].string)); }
#line 1681 "cmFortranParser.cxx" /* yacc.c:1646 */
#line 1648 "cmFortranParser.cxx" /* yacc.c:1646 */
break;
#line 1685 "cmFortranParser.cxx" /* yacc.c:1646 */
#line 1652 "cmFortranParser.cxx" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@ -1911,6 +1878,6 @@ yyreturn:
#endif
return yyresult;
}
#line 286 "cmFortranParser.y" /* yacc.c:1906 */
#line 246 "cmFortranParser.y" /* yacc.c:1906 */
/* End of grammar */

View File

@ -73,6 +73,7 @@ union cmFortran_yystype_u
#define YYSTYPE cmFortran_yystype
#define YYSTYPE_IS_DECLARED 1
#if !defined(cmFortranLexer_cxx)
#define YY_NO_UNISTD_H
#include "cmFortranLexer.h"
#endif
#if !defined(cmFortranLexer_cxx)
@ -117,11 +118,13 @@ struct cmFortranFile
: File(file)
, Buffer(buffer)
, Directory(dir)
, LastCharWasNewline(false)
{
}
FILE* File;
YY_BUFFER_STATE Buffer;
std::string Directory;
bool LastCharWasNewline;
};
struct cmFortranParser_s
@ -146,6 +149,9 @@ struct cmFortranParser_s
// Buffer for string literals.
std::string TokenString;
// Error message text if a parser error occurs.
std::string Error;
// Flag for whether lexer is reading from inside an interface.
bool InInterface;

View File

@ -92,7 +92,6 @@ static bool cmFortranParserIsKeyword(const char* word,
%token F90PPR_IFDEF F90PPR_IFNDEF F90PPR_IF
%token F90PPR_ELSE F90PPR_ELIF F90PPR_ENDIF
%token COMMA DCOLON
%token <string> CPP_TOENDL
%token <number> UNTERMINATED_STRING
%token <string> STRING WORD
%token <string> CPP_INCLUDE_ANGLE
@ -105,156 +104,117 @@ code: /* empty */ | code stmt;
stmt: keyword_stmt | assignment_stmt;
assignment_stmt: WORD ASSIGNMENT_OP other EOSTMT /* Ignore */
{
assignment_stmt:
WORD ASSIGNMENT_OP other EOSTMT {
free($1);
}
}
keyword_stmt:
WORD EOSTMT
{
if (cmFortranParserIsKeyword($1, "interface"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
WORD EOSTMT {
if (cmFortranParserIsKeyword($1, "interface")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, true);
}
free($1);
}
| WORD WORD other EOSTMT
{
if (cmFortranParserIsKeyword($1, "use"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| WORD WORD other EOSTMT {
if (cmFortranParserIsKeyword($1, "use")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, $2);
}
else if (cmFortranParserIsKeyword($1, "module"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword($1, "module")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleModule(parser, $2);
}
else if (cmFortranParserIsKeyword($1, "interface"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword($1, "interface")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, true);
}
else if (cmFortranParserIsKeyword($2, "interface") &&
cmFortranParserIsKeyword($1, "end"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
} else if (cmFortranParserIsKeyword($2, "interface") &&
cmFortranParserIsKeyword($1, "end")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_SetInInterface(parser, false);
}
}
free($1);
free($2);
}
| WORD DCOLON WORD other EOSTMT
{
if (cmFortranParserIsKeyword($1, "use"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| WORD DCOLON WORD other EOSTMT {
if (cmFortranParserIsKeyword($1, "use")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, $3);
}
}
free($1);
free($3);
}
| WORD COMMA WORD DCOLON WORD other EOSTMT
{
}
| WORD COMMA WORD DCOLON WORD other EOSTMT {
if (cmFortranParserIsKeyword($1, "use") &&
cmFortranParserIsKeyword($3, "non_intrinsic") )
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
cmFortranParserIsKeyword($3, "non_intrinsic") ) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUse(parser, $5);
}
}
free($1);
free($3);
free($5);
}
| WORD STRING other EOSTMT /* Ignore */
{
if (cmFortranParserIsKeyword($1, "include"))
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| WORD STRING other EOSTMT {
if (cmFortranParserIsKeyword($1, "include")) {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, $2);
}
}
free($1);
free($2);
}
| CPP_LINE_DIRECTIVE STRING other EOSTMT
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| CPP_LINE_DIRECTIVE STRING other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleLineDirective(parser, $2);
free($2);
}
| CPP_INCLUDE_ANGLE other EOSTMT
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| CPP_INCLUDE_ANGLE other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, $1);
free($1);
}
| include STRING other EOSTMT
{
cmFortranParser* parser =
cmFortran_yyget_extra(yyscanner);
}
| include STRING other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleInclude(parser, $2);
free($2);
}
| define WORD other EOSTMT
{
}
| define WORD other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleDefine(parser, $2);
free($2);
}
| undef WORD other EOSTMT
{
}
| undef WORD other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleUndef(parser, $2);
free($2);
}
| ifdef WORD other EOSTMT
{
}
| ifdef WORD other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIfdef(parser, $2);
free($2);
}
| ifndef WORD other EOSTMT
{
}
| ifndef WORD other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIfndef(parser, $2);
free($2);
}
| if other EOSTMT
{
}
| if other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleIf(parser);
}
| elif other EOSTMT
{
}
| elif other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleElif(parser);
}
| else other EOSTMT
{
}
| else other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleElse(parser);
}
| endif other EOSTMT
{
}
| endif other EOSTMT {
cmFortranParser* parser = cmFortran_yyget_extra(yyscanner);
cmFortranParser_RuleEndif(parser);
}
| WORD GARBAGE other EOSTMT /* Ignore */
{
}
| WORD GARBAGE other EOSTMT {
free($1);
}
}
| GARBAGE other EOSTMT
| EOSTMT
| error

View File

@ -119,8 +119,19 @@ int cmFortranParser_Input(cmFortranParser* parser, char* buffer,
// Read from the file on top of the stack. If the stack is empty,
// the end of the translation unit has been reached.
if (!parser->FileStack.empty()) {
FILE* file = parser->FileStack.top().File;
return (int)fread(buffer, 1, bufferSize, file);
cmFortranFile& ff = parser->FileStack.top();
FILE* file = ff.File;
size_t n = fread(buffer, 1, bufferSize, file);
if (n > 0) {
ff.LastCharWasNewline = buffer[n - 1] == '\n';
} else if (!ff.LastCharWasNewline) {
// The file ended without a newline. Inject one so
// that the file always ends in an end-of-statement.
buffer[0] = '\n';
n = 1;
ff.LastCharWasNewline = true;
}
return (int)n;
}
return 0;
}
@ -164,11 +175,9 @@ int cmFortranParser_GetOldStartcond(cmFortranParser* parser)
return parser->OldStartcond;
}
void cmFortranParser_Error(cmFortranParser* /*unused*/, const char* /*unused*/)
void cmFortranParser_Error(cmFortranParser* parser, const char* msg)
{
// If there is a parser error just ignore it. The source will not
// compile and the user will edit it. Then dependencies will have
// to be regenerated anyway.
parser->Error = msg ? msg : "unknown error";
}
void cmFortranParser_RuleUse(cmFortranParser* parser, const char* name)

View File

@ -1,8 +1,8 @@
/* A Bison parser, made by GNU Bison 3.0.2. */
/* A Bison parser, made by GNU Bison 3.0.4. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -70,11 +70,10 @@ extern int cmFortran_yydebug;
F90PPR_ENDIF = 280,
COMMA = 281,
DCOLON = 282,
CPP_TOENDL = 283,
UNTERMINATED_STRING = 284,
STRING = 285,
WORD = 286,
CPP_INCLUDE_ANGLE = 287
UNTERMINATED_STRING = 283,
STRING = 284,
WORD = 285,
CPP_INCLUDE_ANGLE = 286
};
#endif
/* Tokens. */
@ -103,23 +102,24 @@ extern int cmFortran_yydebug;
#define F90PPR_ENDIF 280
#define COMMA 281
#define DCOLON 282
#define CPP_TOENDL 283
#define UNTERMINATED_STRING 284
#define STRING 285
#define WORD 286
#define CPP_INCLUDE_ANGLE 287
#define UNTERMINATED_STRING 283
#define STRING 284
#define WORD 285
#define CPP_INCLUDE_ANGLE 286
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE YYSTYPE;
union YYSTYPE
{
#line 81 "cmFortranParser.y" /* yacc.c:1909 */
char* string;
#line 122 "cmFortranParserTokens.h" /* yacc.c:1909 */
#line 120 "cmFortranParserTokens.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif