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:
parent
6a7d180e69
commit
4efe38a71d
5 changed files with 45 additions and 12 deletions
|
@ -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: {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue