blob: 6336b5f30dc00dece7f7bebb72455faa3ad0b7e5 [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-analyzer 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();
}
:{NEWLINE} {
// A colon ends the rules
yyextra->newDependency();
// A newline after colon terminates current rule.
yyextra->newEntry();
}
:({WSPACE}+|\\{NEWLINE}) {
// A colon followed by space or line continuation 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__ */