%{
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
/*

This file must be translated to C++ and modified to build everywhere.

Run flex >= 2.6 like this:

  flex --nounistd -DFLEXINT_H --noline --header-file=cmCTestResourceGroupsLexer.h -ocmCTestResourceGroupsLexer.cxx cmCTestResourceGroupsLexer.in.l

Modify cmCTestResourceGroupsLexer.cxx:
  - remove trailing whitespace:              sed -i 's/\s*$//' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx
  - remove blank lines at end of file:       sed -i '${/^$/d;}' cmCTestResourceGroupsLexer.h cmCTestResourceGroupsLexer.cxx
  - #include "cmStandardLexer.h" at the top: sed -i '1i#include "cmStandardLexer.h"' cmCTestResourceGroupsLexer.cxx

*/

/* IWYU pragma: no_forward_declare yyguts_t */

#ifndef __clang_analyzer__ /* Suppress clang-analyzer warnings */

#include "cmCTestResourceGroupsLexerHelper.h"

#include <string>

#include <cstddef>

#ifndef _WIN32
#  include <termios.h>
#endif

/*--------------------------------------------------------------------------*/
%}

%option prefix="cmCTestResourceGroups_yy"

%option reentrant
%option noyywrap
%option nodefault
%pointer

%s RESOURCE_GROUPS_START
%s RESOURCE_GROUPS_END
%s RESOURCE_START
%s RESOURCE_COUNT
%s RESOURCE_END

NUMBER [0-9]+
IDENTIFIER [a-z_][a-z0-9_]*

%%

<INITIAL,RESOURCE_GROUPS_START,RESOURCE_START>{IDENTIFIER}: {
  BEGIN(RESOURCE_COUNT);
  yyextra->SetResourceType(std::string(yytext, yyleng - 1));
}

<INITIAL,RESOURCE_GROUPS_START>{NUMBER} {
  BEGIN(RESOURCE_GROUPS_END);
  std::size_t len = yyleng;
  yyextra->SetProcessCount(std::stoll(yytext, &len, 10));
}

<RESOURCE_COUNT>{NUMBER} {
  BEGIN(RESOURCE_END);
  std::size_t len = yyleng;
  yyextra->SetNeededSlots(std::stoll(yytext, &len, 10));
  yyextra->WriteRequirement();
}

<RESOURCE_GROUPS_END,RESOURCE_END>,+ {
  BEGIN(RESOURCE_START);
}

<INITIAL,RESOURCE_GROUPS_START,RESOURCE_START>;+ {
  BEGIN(RESOURCE_GROUPS_START);
}

<RESOURCE_GROUPS_END,RESOURCE_END>;+ {
  BEGIN(RESOURCE_GROUPS_START);
  yyextra->WriteProcess();
}

<RESOURCE_START,RESOURCE_GROUPS_END,RESOURCE_END><<EOF>> {
  yyextra->WriteProcess();
  return 0;
}

<INITIAL,RESOURCE_GROUPS_START><<EOF>> {
  return 0;
}

<<EOF>> {
  return 1;
}

.|\n {
  return 1;
}

%%

/*--------------------------------------------------------------------------*/

#endif /* __clang_analyzer__ */
