Forked from
CMake / CMake
16984 commits behind the upstream repository.
-
Kyle Edwards authored
Fix some of the semantics of the depfile, add error handling, and refactor cmGccDepfileLexerHelper.
Kyle Edwards authoredFix some of the semantics of the depfile, add error handling, and refactor cmGccDepfileLexerHelper.
cmGccDepfileLexer.in.l 2.59 KiB
%{
/* 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__ */