libexpr: Rearrange lexer files so that yylex_init_extra can be found

This commit is contained in:
Robert Hensing 2024-07-09 15:39:24 +02:00
parent 7fae378835
commit e68234c4f9
4 changed files with 51 additions and 34 deletions

View file

@ -0,0 +1,31 @@
#include "lexer-tab.hh"
#include "lexer-helpers.hh"
#include "parser-tab.hh"
void nix::lexer::internal::initLoc(YYLTYPE * loc)
{
loc->first_line = loc->last_line = 0;
loc->first_column = loc->last_column = 0;
}
void nix::lexer::internal::adjustLoc(yyscan_t yyscanner, YYLTYPE * loc, const char * s, size_t len)
{
loc->stash();
LexerState & lexerState = *yyget_extra(yyscanner);
if (lexerState.docCommentDistance == 1) {
// Preceding token was a doc comment.
ParserLocation doc;
doc.first_column = lexerState.lastDocCommentLoc.first_column;
ParserLocation docEnd;
docEnd.first_column = lexerState.lastDocCommentLoc.last_column;
DocComment docComment{lexerState.at(doc), lexerState.at(docEnd)};
PosIdx locPos = lexerState.at(*loc);
lexerState.positionToDocComment.emplace(locPos, docComment);
}
lexerState.docCommentDistance++;
loc->first_column = loc->last_column;
loc->last_column += len;
}

View file

@ -0,0 +1,9 @@
#pragma once
namespace nix::lexer::internal {
void initLoc(YYLTYPE * loc);
void adjustLoc(yyscan_t yyscanner, YYLTYPE * loc, const char * s, size_t len);
} // namespace nix::lexer

View file

@ -14,6 +14,10 @@
%x INPATH_SLASH %x INPATH_SLASH
%x PATH_START %x PATH_START
%top {
#include "parser-tab.hh" // YYSTYPE
#include "parser-state.hh"
}
%{ %{
#ifdef __clang__ #ifdef __clang__
@ -22,48 +26,19 @@
#include "nixexpr.hh" #include "nixexpr.hh"
#include "parser-tab.hh" #include "parser-tab.hh"
#include "lexer-helpers.hh"
// !!! FIXME !!! namespace nix {
#define YY_EXTRA_TYPE ::nix::LexerState * struct LexerState;
int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); }
YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
#undef YY_EXTRA_TYPE
using namespace nix; using namespace nix;
using namespace nix::lexer::internal;
namespace nix { namespace nix {
#define CUR_POS state->at(*yylloc) #define CUR_POS state->at(*yylloc)
static void initLoc(YYLTYPE * loc)
{
loc->first_line = loc->last_line = 0;
loc->first_column = loc->last_column = 0;
}
static void adjustLoc(yyscan_t yyscanner, YYLTYPE * loc, const char * s, size_t len)
{
loc->stash();
LexerState & lexerState = *yyget_extra(yyscanner);
if (lexerState.docCommentDistance == 1) {
// Preceding token was a doc comment.
ParserLocation doc;
doc.first_column = lexerState.lastDocCommentLoc.first_column;
ParserLocation docEnd;
docEnd.first_column = lexerState.lastDocCommentLoc.last_column;
DocComment docComment{lexerState.at(doc), lexerState.at(docEnd)};
PosIdx locPos = lexerState.at(*loc);
lexerState.positionToDocComment.emplace(locPos, docComment);
}
lexerState.docCommentDistance++;
loc->first_column = loc->last_column;
loc->last_column += len;
}
// we make use of the fact that the parser receives a private copy of the input // we make use of the fact that the parser receives a private copy of the input
// string and can munge around in it. // string and can munge around in it.
static StringToken unescapeStr(SymbolTable & symbols, char * s, size_t length) static StringToken unescapeStr(SymbolTable & symbols, char * s, size_t length)

View file

@ -139,6 +139,7 @@ sources = files(
'function-trace.cc', 'function-trace.cc',
'get-drvs.cc', 'get-drvs.cc',
'json-to-value.cc', 'json-to-value.cc',
'lexer-helpers.cc',
'nixexpr.cc', 'nixexpr.cc',
'paths.cc', 'paths.cc',
'primops.cc', 'primops.cc',
@ -165,6 +166,7 @@ headers = [config_h] + files(
'gc-small-vector.hh', 'gc-small-vector.hh',
'get-drvs.hh', 'get-drvs.hh',
'json-to-value.hh', 'json-to-value.hh',
# internal: 'lexer-helpers.hh',
'nixexpr.hh', 'nixexpr.hh',
'parser-state.hh', 'parser-state.hh',
'pos-idx.hh', 'pos-idx.hh',