| %{ |
| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| |
| /* IWYU pragma: no_forward_declare yyguts_t */ |
| |
| #ifndef __clang_analyzer__ /* Suppress clang scan-build warnings */ |
| |
| #include <cmGccDepfileLexerHelper.h> |
| #include <string> |
| %} |
| |
| %option prefix="cmGccDepfile_yy" |
| %option noyywrap |
| %option reentrant |
| %pointer |
| |
| WSPACE [ \t] |
| NEWLINE \r?\n |
| |
| %% |
| \${2} { |
| // Unescape the dollar sign. |
| yyextra->addToCurrentPath("$"); |
| } |
| \\# { |
| // Unescape the hash. |
| yyextra->addToCurrentPath("#"); |
| } |
| (\\\\)*\\[ ] { |
| // 2N+1 backslashes plus space -> N backslashes plus space. |
| size_t c = (strlen(yytext) - 1) / 2; |
| std::string s(c, '\\'); |
| s.push_back(' '); |
| yyextra->addToCurrentPath(s.c_str()); |
| } |
| (\\\\)+[ ] { |
| // 2N backslashes plus space -> 2N backslashes, end of filename. |
| yytext[strlen(yytext) - 1] = 0; |
| yyextra->addToCurrentPath(yytext); |
| yyextra->newDependency(); |
| } |
| {WSPACE}*\\{NEWLINE} { |
| // A line continuation ends the current file name. |
| yyextra->newRuleOrDependency(); |
| } |
| {NEWLINE} { |
| // A newline ends the current file name and the current rule. |
| yyextra->newEntry(); |
| } |
| :{WSPACE}+ { |
| // A colon followed by space ends the rules and starts a new dependency. |
| yyextra->newDependency(); |
| } |
| {WSPACE}+ { |
| // Rules and dependencies are separated by blocks of whitespace. |
| yyextra->newRuleOrDependency(); |
| } |
| [a-zA-Z0-9+,/_.~()}{%=@\x5B\x5D!\x80-\xFF-]+ { |
| // Got a span of plain text. |
| yyextra->addToCurrentPath(yytext); |
| } |
| . { |
| // Got an otherwise unmatched character. |
| yyextra->addToCurrentPath(yytext); |
| } |
| |
| %% |
| |
| /*--------------------------------------------------------------------------*/ |
| |
| #endif /* __clang_analyzer__ */ |