3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-18 02:16:40 +00:00

Added support for parsing negative numerals in the SMT 2.0 frontend

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2012-10-15 10:02:52 -07:00
parent 6a7d180e69
commit 4efe38a71d
5 changed files with 45 additions and 12 deletions

View file

@ -87,17 +87,12 @@ namespace smt2 {
next();
}
}
scanner::token scanner::read_symbol() {
SASSERT(m_normalized[static_cast<unsigned>(curr())] == 'a' || curr() == ':');
m_string.reset();
m_string.push_back(curr());
next();
scanner::token scanner::read_symbol_core() {
while (true) {
char c = curr();
char n = m_normalized[static_cast<unsigned char>(c)];
if (n == 'a' || n == '0') {
if (n == 'a' || n == '0' || n == '-') {
m_string.push_back(c);
next();
}
@ -110,6 +105,14 @@ namespace smt2 {
}
}
scanner::token scanner::read_symbol() {
SASSERT(m_normalized[static_cast<unsigned>(curr())] == 'a' || curr() == ':' || curr() == '-');
m_string.reset();
m_string.push_back(curr());
next();
read_symbol_core();
}
scanner::token scanner::read_number() {
SASSERT('0' <= curr() && curr() <= '9');
rational q(1);
@ -140,6 +143,22 @@ namespace smt2 {
TRACE("scanner", tout << "new number: " << m_number << "\n";);
return is_float ? FLOAT_TOKEN : INT_TOKEN;
}
scanner::token scanner::read_signed_number() {
SASSERT(curr() == '-');
next();
if ('0' <= curr() && curr() <= '9') {
scanner::token r = read_number();
m_number.neg();
return r;
}
else {
// it is a symbol.
m_string.reset();
m_string.push_back('-');
return read_symbol_core();
}
}
scanner::token scanner::read_string() {
SASSERT(curr() == '\"');
@ -222,7 +241,8 @@ namespace smt2 {
}
}
scanner::scanner(std::istream& stream, bool interactive):
scanner::scanner(cmd_context & ctx, std::istream& stream, bool interactive):
m_ctx(ctx),
m_interactive(interactive),
m_spos(0),
m_curr(0), // avoid Valgrind warning
@ -259,7 +279,7 @@ namespace smt2 {
m_normalized[static_cast<int>('&')] = 'a';
m_normalized[static_cast<int>('*')] = 'a';
m_normalized[static_cast<int>('_')] = 'a';
m_normalized[static_cast<int>('-')] = 'a';
m_normalized[static_cast<int>('-')] = '-';
m_normalized[static_cast<int>('+')] = 'a';
m_normalized[static_cast<int>('=')] = 'a';
m_normalized[static_cast<int>('<')] = 'a';
@ -304,6 +324,11 @@ namespace smt2 {
return read_number();
case '#':
return read_bv_literal();
case '-':
if (m_ctx.is_smtlib2_compliant())
return read_symbol();
else
return read_signed_number();
case -1:
return EOF_TOKEN;
default: {