2012-04-13 03:08:20 +02:00
|
|
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
2009-10-31 15:08:38 +01:00
|
|
|
//*************************************************************************
|
|
|
|
|
// DESCRIPTION: Verilator: Common header between parser and lex
|
|
|
|
|
//
|
2019-11-08 04:33:59 +01:00
|
|
|
// Code available from: https://verilator.org
|
2009-10-31 15:08:38 +01:00
|
|
|
//
|
|
|
|
|
//*************************************************************************
|
|
|
|
|
//
|
2024-01-01 09:19:59 +01:00
|
|
|
// Copyright 2009-2024 by Wilson Snyder. This program is free software; you
|
2020-03-21 16:24:24 +01:00
|
|
|
// can redistribute it and/or modify it under the terms of either the GNU
|
2009-10-31 15:08:38 +01:00
|
|
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
|
|
|
|
// Version 2.0.
|
2020-03-21 16:24:24 +01:00
|
|
|
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
2009-10-31 15:08:38 +01:00
|
|
|
//
|
|
|
|
|
//*************************************************************************
|
2019-10-05 02:17:11 +02:00
|
|
|
|
2021-03-04 03:57:07 +01:00
|
|
|
#ifndef VERILATOR_V3PARSEIMP_H_
|
|
|
|
|
#define VERILATOR_V3PARSEIMP_H_
|
2018-10-14 19:43:24 +02:00
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
#include "config_build.h"
|
|
|
|
|
#include "verilatedos.h"
|
2018-10-14 19:43:24 +02:00
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
#include "V3Error.h"
|
2014-11-22 17:48:39 +01:00
|
|
|
#include "V3FileLine.h"
|
2009-10-31 15:08:38 +01:00
|
|
|
#include "V3Global.h"
|
|
|
|
|
#include "V3Parse.h"
|
2012-08-16 03:14:20 +02:00
|
|
|
#include "V3ParseSym.h"
|
2023-09-25 04:12:23 +02:00
|
|
|
#include "V3ThreadSafety.h"
|
2018-10-14 19:43:24 +02:00
|
|
|
|
2020-06-08 01:59:03 +02:00
|
|
|
#include <algorithm>
|
2009-10-31 15:08:38 +01:00
|
|
|
#include <deque>
|
|
|
|
|
|
|
|
|
|
class V3Lexer;
|
|
|
|
|
|
|
|
|
|
// IMPORTANT: Don't include this file other than in the bison and flex,
|
|
|
|
|
// as it's definitions will confuse other parsers
|
|
|
|
|
|
|
|
|
|
//======================================================================
|
|
|
|
|
// Types (between parser & lexer)
|
|
|
|
|
|
2021-03-12 23:26:53 +01:00
|
|
|
enum V3UniqState : uint8_t { uniq_NONE, uniq_UNIQUE, uniq_UNIQUE0, uniq_PRIORITY };
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2021-03-12 23:26:53 +01:00
|
|
|
enum V3ImportProperty : uint8_t { iprop_NONE, iprop_CONTEXT, iprop_PURE };
|
2009-12-03 12:55:29 +01:00
|
|
|
|
2020-07-01 13:31:53 +02:00
|
|
|
//============================================================================
|
|
|
|
|
// Member qualifiers
|
|
|
|
|
|
2024-01-20 21:06:46 +01:00
|
|
|
struct VMemberQualifiers final {
|
2020-07-01 13:31:53 +02:00
|
|
|
union {
|
|
|
|
|
uint32_t m_flags;
|
|
|
|
|
struct {
|
|
|
|
|
uint32_t m_local : 1; // Local class item (ignored until warning implemented)
|
|
|
|
|
uint32_t m_protected : 1; // Protected class item (ignored until warning implemented)
|
2020-12-07 23:55:22 +01:00
|
|
|
uint32_t m_rand : 1; // Rand property/member qualifier
|
2020-07-01 13:31:53 +02:00
|
|
|
uint32_t m_randc : 1; // Randc property/member qualifier (ignored until supported)
|
|
|
|
|
uint32_t m_virtual : 1; // Virtual property/method qualifier
|
|
|
|
|
uint32_t m_const : 1; // Const property/method qualifier
|
2023-10-31 13:15:54 +01:00
|
|
|
uint32_t m_static : 1; // Static class member
|
2020-07-01 13:31:53 +02:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
static VMemberQualifiers none() {
|
|
|
|
|
VMemberQualifiers q;
|
|
|
|
|
q.m_flags = 0;
|
|
|
|
|
return q;
|
|
|
|
|
}
|
|
|
|
|
static VMemberQualifiers combine(const VMemberQualifiers& a, const VMemberQualifiers& b) {
|
|
|
|
|
VMemberQualifiers q;
|
|
|
|
|
q.m_flags = a.m_flags | b.m_flags;
|
|
|
|
|
return q;
|
|
|
|
|
}
|
|
|
|
|
void applyToNodes(AstNodeFTask* nodesp) const {
|
2021-10-22 14:56:48 +02:00
|
|
|
for (AstNodeFTask* nodep = nodesp; nodep; nodep = VN_AS(nodep->nextp(), NodeFTask)) {
|
2020-11-25 13:03:01 +01:00
|
|
|
if (m_local) nodep->isHideLocal(true);
|
|
|
|
|
if (m_protected) nodep->isHideProtected(true);
|
2023-10-31 13:15:54 +01:00
|
|
|
if (m_static) nodep->isStatic(true);
|
2020-07-01 13:31:53 +02:00
|
|
|
if (m_virtual) nodep->isVirtual(true);
|
|
|
|
|
if (m_const || m_rand || m_randc) {
|
|
|
|
|
nodep->v3error("Syntax error: 'const'/'rand'/'randc' not allowed before "
|
|
|
|
|
"function/task declaration");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void applyToNodes(AstVar* nodesp) const {
|
2021-10-22 14:56:48 +02:00
|
|
|
for (AstVar* nodep = nodesp; nodep; nodep = VN_AS(nodep->nextp(), Var)) {
|
2020-12-07 23:55:22 +01:00
|
|
|
if (m_rand) nodep->isRand(true);
|
2023-09-19 03:17:21 +02:00
|
|
|
if (m_randc) nodep->isRandC(true);
|
2020-11-25 13:03:01 +01:00
|
|
|
if (m_local) nodep->isHideLocal(true);
|
|
|
|
|
if (m_protected) nodep->isHideProtected(true);
|
2020-07-01 13:31:53 +02:00
|
|
|
if (m_static) nodep->lifetime(VLifetime::STATIC);
|
|
|
|
|
if (m_const) nodep->isConst(true);
|
|
|
|
|
if (m_virtual) {
|
|
|
|
|
nodep->v3error("Syntax error: 'virtual' not allowed before var declaration");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
//============================================================================
|
2017-09-19 04:54:54 +02:00
|
|
|
// Parser YYSType, e.g. for parser's yylval
|
2009-10-31 15:08:38 +01:00
|
|
|
// We can't use bison's %union as we want to pass the fileline with all tokens
|
|
|
|
|
|
2024-01-20 21:06:46 +01:00
|
|
|
struct V3ParseBisonYYSType final {
|
2020-04-15 13:58:34 +02:00
|
|
|
FileLine* fl;
|
|
|
|
|
AstNode* scp; // Symbol table scope for future lookups
|
|
|
|
|
int token; // Read token, aka tok
|
2009-10-31 15:08:38 +01:00
|
|
|
union {
|
2020-04-15 13:58:34 +02:00
|
|
|
V3Number* nump;
|
|
|
|
|
string* strp;
|
|
|
|
|
int cint;
|
|
|
|
|
double cdouble;
|
|
|
|
|
bool cbool;
|
2020-07-01 13:31:53 +02:00
|
|
|
VMemberQualifiers qualifiers;
|
2020-04-15 13:58:34 +02:00
|
|
|
V3UniqState uniqstate;
|
2019-05-19 22:13:13 +02:00
|
|
|
V3ImportProperty iprop;
|
2020-04-20 03:19:09 +02:00
|
|
|
VSigning::en signstate;
|
2019-05-19 22:13:13 +02:00
|
|
|
V3ErrorCode::en errcodeen;
|
2022-01-02 19:56:40 +01:00
|
|
|
VAttrType::en attrtypeen;
|
2020-04-26 18:45:06 +02:00
|
|
|
VLifetime::en lifetime;
|
2022-09-14 13:39:27 +02:00
|
|
|
VStrength::en strength;
|
2019-05-19 22:13:13 +02:00
|
|
|
|
2021-10-22 20:02:45 +02:00
|
|
|
#include "V3Ast__gen_yystype.h"
|
2009-10-31 15:08:38 +01:00
|
|
|
};
|
|
|
|
|
};
|
2023-09-25 04:12:23 +02:00
|
|
|
std::ostream& operator<<(std::ostream& os, const V3ParseBisonYYSType& rhs) VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
#define YYSTYPE V3ParseBisonYYSType
|
|
|
|
|
|
2009-10-31 15:14:04 +01:00
|
|
|
//######################################################################
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2020-11-19 03:32:16 +01:00
|
|
|
class V3ParseImp final {
|
2009-10-31 15:08:38 +01:00
|
|
|
// MEMBERS
|
2021-11-26 23:55:36 +01:00
|
|
|
AstNetlist* const m_rootp; // Root of the design
|
|
|
|
|
VInFilter* const m_filterp; // Reading filter
|
2020-04-15 13:58:34 +02:00
|
|
|
V3ParseSym* m_symp; // Symbol table
|
|
|
|
|
|
2022-01-01 17:46:49 +01:00
|
|
|
V3Lexer* m_lexerp = nullptr; // Current FlexLexer
|
2020-04-15 13:58:34 +02:00
|
|
|
static V3ParseImp* s_parsep; // Current THIS, bison() isn't class based
|
2022-01-01 17:46:49 +01:00
|
|
|
FileLine* m_lexFileline = nullptr; // Filename/linenumber currently active for lexing
|
2020-06-07 19:45:50 +02:00
|
|
|
|
2022-11-27 11:52:40 +01:00
|
|
|
FileLine* m_bisonLastFileline = nullptr; // Filename/linenumber of last token
|
2020-04-15 13:58:34 +02:00
|
|
|
|
2022-01-01 17:46:49 +01:00
|
|
|
bool m_inLibrary = false; // Currently reading a library vs. regular file
|
|
|
|
|
int m_lexKwdDepth = 0; // Inside a `begin_keywords
|
2020-06-07 18:18:23 +02:00
|
|
|
int m_lexKwdLast; // Last LEX state in `begin_keywords
|
2020-04-10 05:26:03 +02:00
|
|
|
VOptionBool m_unconnectedDrive; // Last unconnected drive
|
2019-05-19 22:13:13 +02:00
|
|
|
|
2022-01-01 17:46:49 +01:00
|
|
|
int m_lexPrevToken = 0; // previous parsed token (for lexer)
|
2022-11-28 16:53:55 +01:00
|
|
|
bool m_afterColonColon = false; // The previous token was '::'
|
2020-06-07 21:35:36 +02:00
|
|
|
std::deque<V3ParseBisonYYSType> m_tokensAhead; // Tokens we parsed ahead of parser
|
2019-05-19 22:13:13 +02:00
|
|
|
|
2020-04-15 13:58:34 +02:00
|
|
|
std::deque<string*> m_stringps; // Created strings for later cleanup
|
|
|
|
|
std::deque<V3Number*> m_numberps; // Created numbers for later cleanup
|
2020-06-07 18:18:23 +02:00
|
|
|
std::deque<FileLine> m_lexLintState; // Current lint state for save/restore
|
2020-04-15 13:58:34 +02:00
|
|
|
std::deque<string> m_ppBuffers; // Preprocessor->lex buffer of characters to process
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2022-01-01 17:46:49 +01:00
|
|
|
AstNode* m_tagNodep = nullptr; // Points to the node to set to m_tag or nullptr to not set.
|
2020-04-16 01:39:03 +02:00
|
|
|
VTimescale m_timeLastUnit; // Last `timescale's unit
|
|
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
public:
|
2022-09-18 21:53:42 +02:00
|
|
|
VL_DEFINE_DEBUG_FUNCTIONS;
|
2009-10-31 15:08:38 +01:00
|
|
|
// Note these are an exception to using the filename as the debug type
|
2022-09-18 21:53:42 +02:00
|
|
|
VL_DEFINE_DEBUG(Bison); // Define 'unsigned debugBison()'
|
|
|
|
|
VL_DEFINE_DEBUG(Flex); // Define 'unsigned debugFlex()'
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
// Functions called by lex rules:
|
|
|
|
|
int yylexThis();
|
|
|
|
|
static bool optFuture(const string& flag) { return v3Global.opt.isFuture(flag); }
|
|
|
|
|
|
2017-10-06 13:33:52 +02:00
|
|
|
void tagNodep(AstNode* nodep) { m_tagNodep = nodep; }
|
2020-04-15 13:58:34 +02:00
|
|
|
AstNode* tagNodep() const { return m_tagNodep; }
|
2023-09-25 04:12:23 +02:00
|
|
|
void lexTimescaleParse(FileLine* fl, const char* textp) VL_MT_DISABLED;
|
2020-04-16 01:39:03 +02:00
|
|
|
void timescaleMod(FileLine* fl, AstNodeModule* modp, bool unitSet, double unitVal,
|
2023-09-25 04:12:23 +02:00
|
|
|
bool precSet, double precVal) VL_MT_DISABLED;
|
2020-04-16 01:39:03 +02:00
|
|
|
VTimescale timeLastUnit() const { return m_timeLastUnit; }
|
2017-10-06 13:33:52 +02:00
|
|
|
|
2023-10-09 02:38:45 +02:00
|
|
|
void lexFileline(FileLine* fl) { m_lexFileline = fl; }
|
2020-06-07 19:45:50 +02:00
|
|
|
FileLine* lexFileline() const { return m_lexFileline; }
|
2023-09-25 04:12:23 +02:00
|
|
|
static void lexErrorPreprocDirective(FileLine* fl, const char* textp) VL_MT_DISABLED;
|
|
|
|
|
static string lexParseTag(const char* textp) VL_MT_DISABLED;
|
|
|
|
|
static double lexParseTimenum(const char* text) VL_MT_DISABLED;
|
|
|
|
|
void lexPpline(const char* textp) VL_MT_DISABLED;
|
|
|
|
|
void lexVerilatorCmtLint(FileLine* fl, const char* textp, bool warnOff) VL_MT_DISABLED;
|
|
|
|
|
void lexVerilatorCmtLintSave(const FileLine* fl) VL_MT_DISABLED;
|
|
|
|
|
void lexVerilatorCmtLintRestore(FileLine* fl) VL_MT_DISABLED;
|
|
|
|
|
static void lexVerilatorCmtBad(FileLine* fl, const char* textp) VL_MT_DISABLED;
|
2020-06-07 18:18:23 +02:00
|
|
|
|
|
|
|
|
void lexPushKeywords(int state) {
|
|
|
|
|
++m_lexKwdDepth;
|
|
|
|
|
m_lexKwdLast = state;
|
2020-04-15 13:58:34 +02:00
|
|
|
}
|
2020-06-07 18:18:23 +02:00
|
|
|
bool lexPopKeywords() {
|
|
|
|
|
if (m_lexKwdDepth) {
|
|
|
|
|
--m_lexKwdDepth;
|
2020-04-15 13:58:34 +02:00
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-07 18:18:23 +02:00
|
|
|
int lexKwdLastState() const { return m_lexKwdLast; }
|
2023-09-25 04:12:23 +02:00
|
|
|
static const char* tokenName(int tok) VL_MT_DISABLED;
|
|
|
|
|
static bool isStrengthToken(int tok) VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2019-07-15 03:42:03 +02:00
|
|
|
void ppPushText(const string& text) {
|
|
|
|
|
m_ppBuffers.push_back(text);
|
2020-06-07 19:45:50 +02:00
|
|
|
if (lexFileline()->contentp()) lexFileline()->contentp()->pushText(text);
|
2019-07-15 03:42:03 +02:00
|
|
|
}
|
2023-09-25 04:12:23 +02:00
|
|
|
size_t ppInputToLex(char* buf, size_t max_size) VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
static V3ParseImp* parsep() { return s_parsep; }
|
|
|
|
|
|
|
|
|
|
// TODO: Many of these functions are the old interface; they'd be better as non-static
|
|
|
|
|
// and called as READP->newString(...) etc.
|
2020-06-07 20:07:15 +02:00
|
|
|
// These can be called by either parser or lexer, as not lex/parser-position aware
|
2009-10-31 15:08:38 +01:00
|
|
|
string* newString(const string& text) {
|
2019-05-19 22:13:13 +02:00
|
|
|
// Allocate a string, remembering it so we can reclaim storage at lex end
|
2022-08-30 07:02:39 +02:00
|
|
|
string* const strp = new std::string{text};
|
2019-05-19 22:13:13 +02:00
|
|
|
m_stringps.push_back(strp);
|
|
|
|
|
return strp;
|
2009-10-31 15:08:38 +01:00
|
|
|
}
|
|
|
|
|
string* newString(const char* text) {
|
2019-05-19 22:13:13 +02:00
|
|
|
// Allocate a string, remembering it so we can reclaim storage at lex end
|
2022-08-30 07:02:39 +02:00
|
|
|
string* const strp = new std::string{text};
|
2019-05-19 22:13:13 +02:00
|
|
|
m_stringps.push_back(strp);
|
|
|
|
|
return strp;
|
2009-10-31 15:08:38 +01:00
|
|
|
}
|
2010-04-07 02:20:44 +02:00
|
|
|
string* newString(const char* text, size_t length) {
|
2021-11-26 23:55:36 +01:00
|
|
|
string* const strp = new string(text, length);
|
2019-05-19 22:13:13 +02:00
|
|
|
m_stringps.push_back(strp);
|
|
|
|
|
return strp;
|
2009-10-31 15:08:38 +01:00
|
|
|
}
|
2022-10-07 15:58:06 +02:00
|
|
|
V3Number* newNumber(FileLine* flp, const char* text) {
|
2022-11-11 04:58:27 +01:00
|
|
|
V3Number* nump = new V3Number{flp, text};
|
2019-05-10 02:03:19 +02:00
|
|
|
m_numberps.push_back(nump);
|
|
|
|
|
return nump;
|
2009-10-31 15:08:38 +01:00
|
|
|
}
|
|
|
|
|
|
2020-06-07 19:45:50 +02:00
|
|
|
// Bison sometimes needs error context without a token, so remember last token's line
|
2022-12-03 00:46:38 +01:00
|
|
|
// Only use this if do not have and cannot get a token-relevant fileline
|
2020-06-07 19:45:50 +02:00
|
|
|
FileLine* bisonLastFileline() const { return m_bisonLastFileline; }
|
|
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
// Return next token, for bison, since bison isn't class based, use a global THIS
|
2011-08-05 03:58:45 +02:00
|
|
|
AstNetlist* rootp() const { return m_rootp; }
|
|
|
|
|
bool inLibrary() const { return m_inLibrary; }
|
2020-04-10 05:26:03 +02:00
|
|
|
VOptionBool unconnectedDrive() const { return m_unconnectedDrive; }
|
|
|
|
|
void unconnectedDrive(const VOptionBool flag) { m_unconnectedDrive = flag; }
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
// Interactions with parser
|
2023-09-25 04:12:23 +02:00
|
|
|
int bisonParse() VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
// Interactions with lexer
|
2023-09-25 04:12:23 +02:00
|
|
|
void lexNew() VL_MT_DISABLED;
|
|
|
|
|
void lexDestroy() VL_MT_DISABLED;
|
|
|
|
|
static int stateVerilogRecent() VL_MT_DISABLED; // Parser -> lexer communication
|
2020-06-07 18:18:23 +02:00
|
|
|
int lexPrevToken() const { return m_lexPrevToken; } // Parser -> lexer communication
|
2019-05-19 22:13:13 +02:00
|
|
|
size_t flexPpInputToLex(char* buf, size_t max_size) { return ppInputToLex(buf, max_size); }
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2009-10-31 15:14:04 +01:00
|
|
|
//==== Symbol tables
|
2012-08-16 03:28:30 +02:00
|
|
|
V3ParseSym* symp() { return m_symp; }
|
2022-07-30 17:52:35 +02:00
|
|
|
AstPackage* unitPackage(FileLine* /*fl*/) {
|
2021-07-29 14:40:41 +02:00
|
|
|
// Find one made earlier?
|
2021-11-26 23:55:36 +01:00
|
|
|
const VSymEnt* const rootSymp
|
|
|
|
|
= symp()->symRootp()->findIdFlat(AstPackage::dollarUnitName());
|
2021-07-29 14:40:41 +02:00
|
|
|
AstPackage* pkgp;
|
|
|
|
|
if (!rootSymp) {
|
|
|
|
|
pkgp = parsep()->rootp()->dollarUnitPkgAddp();
|
|
|
|
|
symp()->reinsert(pkgp, symp()->symRootp()); // Don't push/pop scope as they're global
|
|
|
|
|
} else {
|
2021-10-22 14:56:48 +02:00
|
|
|
pkgp = VN_AS(rootSymp->nodep(), Package);
|
2021-07-29 14:40:41 +02:00
|
|
|
}
|
|
|
|
|
return pkgp;
|
|
|
|
|
}
|
2009-10-31 15:14:04 +01:00
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
public:
|
2017-11-01 23:51:41 +01:00
|
|
|
// CONSTRUCTORS
|
2019-10-05 13:54:14 +02:00
|
|
|
V3ParseImp(AstNetlist* rootp, VInFilter* filterp, V3ParseSym* parserSymp)
|
2020-08-16 15:55:36 +02:00
|
|
|
: m_rootp{rootp}
|
|
|
|
|
, m_filterp{filterp}
|
|
|
|
|
, m_symp{parserSymp} {
|
2020-06-07 18:18:23 +02:00
|
|
|
m_lexKwdLast = stateVerilogRecent();
|
2020-04-16 01:39:03 +02:00
|
|
|
m_timeLastUnit = v3Global.opt.timeDefaultUnit();
|
2009-10-31 15:08:38 +01:00
|
|
|
}
|
2023-09-25 04:12:23 +02:00
|
|
|
~V3ParseImp() VL_MT_DISABLED;
|
|
|
|
|
void parserClear() VL_MT_DISABLED;
|
|
|
|
|
void lexUnputString(const char* textp, size_t length) VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
// METHODS
|
|
|
|
|
// Preprocess and read the Verilog file specified into the netlist database
|
2023-09-25 04:12:23 +02:00
|
|
|
int tokenToBison() VL_MT_DISABLED; // Pass token to bison
|
2009-10-31 15:08:38 +01:00
|
|
|
|
2011-10-28 02:56:38 +02:00
|
|
|
void parseFile(FileLine* fileline, const string& modfilename, bool inLibrary,
|
2023-09-25 04:12:23 +02:00
|
|
|
const string& errmsg) VL_MT_DISABLED;
|
|
|
|
|
void dumpInputsFile() VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
|
|
|
|
|
private:
|
2023-09-25 04:12:23 +02:00
|
|
|
void preprocDumps(std::ostream& os);
|
|
|
|
|
void lexFile(const string& modname) VL_MT_DISABLED;
|
|
|
|
|
void yylexReadTok() VL_MT_DISABLED;
|
|
|
|
|
void tokenPull() VL_MT_DISABLED;
|
|
|
|
|
void tokenPipeline() VL_MT_DISABLED; // Internal; called from tokenToBison
|
|
|
|
|
void tokenPipelineSym() VL_MT_DISABLED;
|
|
|
|
|
size_t tokenPipeScanParam(size_t depth) VL_MT_DISABLED;
|
|
|
|
|
size_t tokenPipeScanType(size_t depth) VL_MT_DISABLED;
|
|
|
|
|
const V3ParseBisonYYSType* tokenPeekp(size_t depth) VL_MT_DISABLED;
|
|
|
|
|
void preprocDumps(std::ostream& os, bool forInputs) VL_MT_DISABLED;
|
2009-10-31 15:08:38 +01:00
|
|
|
};
|
|
|
|
|
|
2019-05-19 22:13:13 +02:00
|
|
|
#endif // Guard
|