Internals: Move yyerror to parser. No functional change intended.

This commit is contained in:
Wilson Snyder 2020-06-07 10:31:33 -04:00
parent 418b36ea71
commit 53d8ccd149
4 changed files with 43 additions and 46 deletions

View File

@ -330,6 +330,10 @@ void V3ParseImp::lexFile(const string& modname) {
if (bisonParse()) v3fatal("Cannot continue\n");
}
bool V3ParseImp::bisonValIdThenColon() const {
return bisonValPrev().token == yaID__ETC && bisonValCur().token == yP_COLONCOLON;
}
void V3ParseImp::lexToken() {
// called from lexToBison, has a "this"
// Fetch next token from prefetch or real lexer
@ -476,8 +480,8 @@ void V3ParseImp::lexToken() {
int V3ParseImp::lexToBison() {
// Called as global since bison doesn't have our pointer
lexToken(); // sets yylval
m_prevBisonVal = m_curBisonVal;
m_curBisonVal = yylval;
m_bisonValPrev = m_bisonValCur;
m_bisonValCur = yylval;
// yylval.scp = NULL; // Symbol table not yet needed - no packages
if (debugFlex() >= 6 || debugBison() >= 6) { // --debugi-flex and --debugi-bison

View File

@ -116,8 +116,8 @@ class V3ParseImp {
int m_prevLexToken; // previous parsed token (for lexer)
bool m_ahead; // aheadval is valid
V3ParseBisonYYSType m_aheadVal; // ahead token value
V3ParseBisonYYSType m_curBisonVal; // current token for error reporting
V3ParseBisonYYSType m_prevBisonVal; // previous token for error reporting
V3ParseBisonYYSType m_bisonValCur; // current token for error reporting
V3ParseBisonYYSType m_bisonValPrev; // previous token for error reporting
std::deque<string*> m_stringps; // Created strings for later cleanup
std::deque<V3Number*> m_numberps; // Created numbers for later cleanup
@ -229,8 +229,9 @@ public:
static int stateVerilogRecent(); // Parser -> lexer communication
int prevLexToken() const { return m_prevLexToken; } // Parser -> lexer communication
size_t flexPpInputToLex(char* buf, size_t max_size) { return ppInputToLex(buf, max_size); }
V3ParseBisonYYSType curBisonVal() const { return m_curBisonVal; }
V3ParseBisonYYSType prevBisonVal() const { return m_prevBisonVal; }
V3ParseBisonYYSType bisonValCur() const { return m_bisonValCur; }
V3ParseBisonYYSType bisonValPrev() const { return m_bisonValPrev; }
bool bisonValIdThenColon() const;
//==== Symbol tables
V3ParseSym* symp() { return m_symp; }
@ -249,8 +250,8 @@ public:
m_lastVerilogState = stateVerilogRecent();
m_prevLexToken = 0;
m_ahead = false;
m_curBisonVal.token = 0;
m_prevBisonVal.token = 0;
m_bisonValCur.token = 0;
m_bisonValPrev.token = 0;
// m_aheadVal not used as m_ahead = false, and not all compilers support initing it
m_tagNodep = NULL;
m_timeLastUnit = v3Global.opt.timeDefaultUnit();

View File

@ -27,9 +27,6 @@
#include "V3ParseImp.h" // Defines YYTYPE; before including bison header
#include "V3ParseBison.h" // Generated by bison
extern void yyerror(const char*);
extern void yyerrorf(const char* format, ...);
#define STATE_VERILOG_RECENT S17 // State name for most recent Verilog Version
#define PARSEP V3ParseImp::parsep()
@ -61,38 +58,6 @@ extern void yyerrorf(const char* format, ...);
//======================================================================
void yyerror(const char* errmsg) {
PARSEP->fileline()->v3error(errmsg);
static const char* const colonmsg = "syntax error, unexpected ::, ";
// tokens;
if (0 == strncmp(errmsg, colonmsg, strlen(colonmsg))
&& PARSEP->prevBisonVal().token == yaID__ETC
&& PARSEP->curBisonVal().token == yP_COLONCOLON) {
static int warned = false;
if (!warned++) {
std::cerr << PARSEP->fileline()->warnMore()
<< ("... Perhaps '" + *PARSEP->prevBisonVal().strp
+ "' is a package which needs to be predeclared? (IEEE 1800-2017 26.3)")
<< std::endl;
}
}
}
void yyerrorf(const char* format, ...) {
const int maxlen = 2000;
char msg[maxlen];
va_list ap;
va_start(ap, format);
VL_VSNPRINTF(msg, maxlen, format, ap);
msg[maxlen - 1] = '\0';
va_end(ap);
yyerror(msg);
}
//======================================================================
static double lexParseDouble(FileLine* fl, const char* textp, size_t length) {
string text = std::string(textp, length);
bool success = false;

View File

@ -44,9 +44,6 @@
#define GATEUNSUP(fl, tok) \
{ BBUNSUP((fl), "Unsupported: Verilog 1995 gate primitive: " << (tok)); }
extern void yyerror(const char* errmsg);
extern void yyerrorf(const char* format, ...);
//======================================================================
// Statics (for here only)
@ -293,6 +290,36 @@ static void UNSUPREAL(FileLine* fileline) {
//======================================================================
void yyerror(const char* errmsg) {
PARSEP->fileline()->v3error(errmsg);
static const char* const colonmsg = "syntax error, unexpected ::, ";
// tokens;
if (0 == strncmp(errmsg, colonmsg, strlen(colonmsg)) && PARSEP->bisonValIdThenColon()) {
static int warned = false;
if (!warned++) {
std::cerr << PARSEP->fileline()->warnMore()
<< ("... Perhaps '" + *PARSEP->bisonValPrev().strp
+ "' is a package which needs to be predeclared? (IEEE 1800-2017 26.3)")
<< std::endl;
}
}
}
void yyerrorf(const char* format, ...) {
const int maxlen = 2000;
char msg[maxlen];
va_list ap;
va_start(ap, format);
VL_VSNPRINTF(msg, maxlen, format, ap);
msg[maxlen - 1] = '\0';
va_end(ap);
yyerror(msg);
}
//======================================================================
class AstSenTree;
// clang-format off
%}