Browse Source

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
Brad King 9 years ago
parent
commit
f506489d1e

+ 2 - 0
Source/.gitattributes

@@ -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

+ 6 - 0
Source/cmDependsFortran.cxx

@@ -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
+ 606 - 628
Source/cmFortranLexer.cxx


+ 70 - 77
Source/cmFortranLexer.h

@@ -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;
-
-        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;
-
-        /* Number of characters read into yy_ch_buf, not including EOB
-         * characters.
-         */
-        yy_size_t 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 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;
+	{
+	FILE *yy_input_file;
+
+	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.
+	 */
+	int yy_buf_size;
+
+	/* 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 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;
 
     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 */

+ 5 - 12
Source/cmFortranLexer.in.l

@@ -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.  */

+ 185 - 218
Source/cmFortranParser.cxx

@@ -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 */

+ 6 - 0
Source/cmFortranParser.h

@@ -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;
 

+ 61 - 101
Source/cmFortranParser.y

@@ -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

+ 15 - 6
Source/cmFortranParserImpl.cxx

@@ -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)

+ 14 - 14
Source/cmFortranParserTokens.h

@@ -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

Some files were not shown because too many files changed in this diff