%{ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ /*------------------------------------------------------------------------- Portions of this source have been derived from makedepf90 version 2.8.8, Copyright (C) 2000--2006 Erik Edelmann The code was originally distributed under the GPL but permission from the copyright holder has been obtained to distribute this derived work under the CMake license. -------------------------------------------------------------------------*/ /* This file must be translated to C and modified to build everywhere. Run flex >= 2.6 like this: flex -i --prefix=cmFortran_yy --header-file=cmFortranLexer.h -ocmFortranLexer.cxx cmFortranLexer.in.l Modify cmFortranLexer.cxx: - 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 - 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. */ /* Replace the lexer input function. */ #undef YY_INPUT #define YY_INPUT(buf, result, max_size) \ { result = cmFortranParser_Input(yyextra, buf, max_size); } /* Include the set of tokens from the parser. */ #include "cmFortranParserTokens.h" /*--------------------------------------------------------------------------*/ %} %option reentrant %option noyywrap %pointer %s free_fmt fixed_fmt %x str_sq str_dq %% \" { cmFortranParser_StringStart(yyextra); cmFortranParser_SetOldStartcond(yyextra, YY_START); BEGIN(str_dq); } ' { cmFortranParser_StringStart(yyextra); cmFortranParser_SetOldStartcond(yyextra, YY_START); BEGIN(str_sq); } \" | ' { BEGIN(cmFortranParser_GetOldStartcond(yyextra) ); yylvalp->string = strdup(cmFortranParser_StringEnd(yyextra)); return STRING; } &[ \t]*\n | &[ \t]*\n[ \t]*& /* Ignore (continued strings, free fmt) */ \n[ ]{5}[^ \t\n] { if (cmFortranParser_GetOldStartcond(yyextra) == fixed_fmt) ; /* Ignore (cont. strings, fixed fmt) */ else { unput(yytext[strlen(yytext)-1]); } } \n { unput ('\n'); BEGIN(INITIAL); return UNTERMINATED_STRING; } . { cmFortranParser_StringAppend(yyextra, yytext[0]); } !.*\n { return EOSTMT; } /* Treat comments like */ ^[cC*dD].*\n { return EOSTMT; } /* empty lines */ ^[ \t]*#([ \t]*line)?[ \t]*[0-9]+[ \t]* { return CPP_LINE_DIRECTIVE; } ^[ \t]*#[ \t]*include[ \t]*<[^>]+> { yytext[yyleng-1] = 0; yylvalp->string = strdup(strchr(yytext, '<')+1); return CPP_INCLUDE_ANGLE; } ^[ \t]*#[ \t]*include { return CPP_INCLUDE; } \$[ \t]*include { return F90PPR_INCLUDE; } \?\?[ \t]*include { return COCO_INCLUDE; } ^[ \t]*#[ \t]*define { return CPP_DEFINE; } \$[ \t]*DEFINE { return F90PPR_DEFINE; } ^[ \t]*#[ \t]*undef { return CPP_UNDEF; } \$[ \t]*UNDEF { return F90PPR_UNDEF; } ^[ \t]*#[ \t]*ifdef { return CPP_IFDEF; } ^[ \t]*#[ \t]*ifndef { return CPP_IFNDEF; } ^[ \t]*#[ \t]*if { return CPP_IF; } ^[ \t]*#[ \t]*elif { return CPP_ELIF; } ^[ \t]*#[ \t]*else { return CPP_ELSE; } ^[ \t]*#[ \t]*endif { return CPP_ENDIF; } $[ \t]*ifdef { return F90PPR_IFDEF; } $[ \t]*ifndef { return F90PPR_IFNDEF; } $[ \t]*if { return F90PPR_IF; } $[ \t]*elif { return F90PPR_ELIF; } $[ \t]*else { return F90PPR_ELSE; } $[ \t]*endif { return F90PPR_ENDIF; } /* Line continuations, possible involving comments. */ &([ \t\n]*|!.*)* &([ \t\n]*|!.*)*& , { return COMMA; } :: { return DCOLON; } : { return COLON; } \n[ ]{5}[^ ] { return GARBAGE; } =|=> { return ASSIGNMENT_OP; } [Ee][Nn][Dd] { return END; } [Ii][Nn][Cc][Ll][Uu][Dd][Ee] { return INCLUDE; } [Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee] { return INTERFACE; } [Mm][Oo][Dd][Uu][Ll][Ee] { return MODULE; } [Ss][Uu][bb][Mm][Oo][Dd][Uu][Ll][Ee] { return SUBMODULE; } [Uu][Ss][Ee] { return USE; } [a-zA-Z_][a-zA-Z_0-9]* { yylvalp->string = strdup(yytext); return WORD; } \( { return LPAREN; } \) { return RPAREN; } [^ \t\n\r:;,!'"a-zA-Z=&()]+ { return GARBAGE; } ;|\n { return EOSTMT; } [ \t\r,] /* Ignore */ \\[ \t]*\n /* Ignore line-endings preceded by \ */ . { return *yytext; } <> { if(!cmFortranParser_FilePop(yyextra) ) { return YY_NULL; } } %% /*--------------------------------------------------------------------------*/ YY_BUFFER_STATE cmFortranLexer_GetCurrentBuffer(yyscan_t yyscanner) { /* Hack into the internal flex-generated scanner to get the buffer. */ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return YY_CURRENT_BUFFER; }