3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-06 06:03:23 +00:00

Liberty file parser now accepts superfluous ;

This commit is contained in:
Niels Moseley 2019-03-27 15:15:53 +01:00
parent 7682629b79
commit 487cb45b87
4 changed files with 151 additions and 9 deletions

View file

@ -155,11 +155,13 @@ int LibertyParser::lexer(std::string &str)
// check for a backslash
if (c == '\\') {
c = f.get();
c = f.get();
if (c == '\r')
c = f.get();
if (c == '\n')
if (c == '\n') {
line++;
return lexer(str);
}
f.unget();
return '\\';
}
@ -186,14 +188,39 @@ LibertyAst *LibertyParser::parse()
int tok = lexer(str);
while (tok == 'n')
// there are liberty files in the while that
// have superfluous ';' at the end of
// a { ... }. We simply ignore a ';' here.
// and get to the next statement.
while ((tok == 'n') || (tok == ';'))
tok = lexer(str);
if (tok == '}' || tok < 0)
return NULL;
if (tok != 'v')
error();
if (tok != 'v') {
std::string eReport;
switch(tok)
{
case 'n':
error("Unexpected newline.");
break;
case '[':
case ']':
case '}':
case '{':
case '\"':
case ':':
eReport = "Unexpected '";
eReport += static_cast<char>(tok);
eReport += "'.";
error(eReport);
break;
default:
error();
}
}
LibertyAst *ast = new LibertyAst;
ast->id = str;
@ -282,8 +309,28 @@ LibertyAst *LibertyParser::parse()
}
continue;
}
if (tok != 'v')
error();
if (tok != 'v') {
std::string eReport;
switch(tok)
{
case 'n':
error("Unexpected newline.");
break;
case '[':
case ']':
case '}':
case '{':
case '\"':
case ':':
eReport = "Unexpected '";
eReport += static_cast<char>(tok);
eReport += "'.";
error(eReport);
break;
default:
error();
}
}
ast->args.push_back(arg);
}
continue;