blob: c83cb75e813c74a1126113ebf6b6901da2e817fd [file] [log] [blame]
%{
/* 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__ */