mirror of
https://github.com/AdaCore/cvc5.git
synced 2026-02-12 12:32:16 -08:00
This PR adds the proper checks for the parser API. It furthermore adds examples and unit tests for the parser API. Note that InputParser::nextCommand and InputParser::nextTerm don't catch exceptions, since we want to throw ParserExceptions containing the parsing information, not API exceptions. Also, at the moment, the InputParser can throw an exception during initialization, which is not caught either.
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
/******************************************************************************
|
|
* Top contributors (to current version):
|
|
* Andrew Reynolds
|
|
*
|
|
* This file is part of the cvc5 project.
|
|
*
|
|
* Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
|
|
* in the top-level source directory and their institutional affiliations.
|
|
* All rights reserved. See the file COPYING in the top-level source
|
|
* directory for licensing information.
|
|
* ****************************************************************************
|
|
*
|
|
* A simple demonstration of using multiple parsers with the same symbol manager
|
|
* via C++ API.
|
|
*/
|
|
|
|
#include <cvc5/cvc5.h>
|
|
#include <cvc5/cvc5_parser.h>
|
|
|
|
#include <iostream>
|
|
|
|
using namespace cvc5;
|
|
using namespace cvc5::parser;
|
|
|
|
int main()
|
|
{
|
|
Solver slv;
|
|
|
|
SymbolManager sm(&slv);
|
|
|
|
// construct an input parser associated the solver above
|
|
InputParser parser(&slv, &sm);
|
|
|
|
std::stringstream ss;
|
|
ss << "(set-logic QF_LIA)" << std::endl;
|
|
ss << "(declare-fun a () Int)" << std::endl;
|
|
ss << "(declare-fun b () Int)" << std::endl;
|
|
ss << "(declare-fun c () Bool)" << std::endl;
|
|
parser.setStreamInput(modes::InputLanguage::SMT_LIB_2_6, ss, "MyStream");
|
|
|
|
// parse commands until finished
|
|
Command cmd;
|
|
while (true)
|
|
{
|
|
cmd = parser.nextCommand();
|
|
if (cmd.isNull())
|
|
{
|
|
break;
|
|
}
|
|
std::cout << "Executing command " << cmd << ":" << std::endl;
|
|
// invoke the command on the solver and the symbol manager, print the result
|
|
// to std::cout
|
|
cmd.invoke(&slv, &sm, std::cout);
|
|
}
|
|
std::cout << "Finished parsing commands" << std::endl;
|
|
|
|
// Note that sm now has a,b,c in its symbol table.
|
|
|
|
// Now, construct a new parser with the same symbol manager. We will parse
|
|
// terms with it.
|
|
InputParser parser2(&slv, &sm);
|
|
std::stringstream ss2;
|
|
ss2 << "(+ a b)" << std::endl;
|
|
ss2 << "(- a 10)" << std::endl;
|
|
ss2 << "(>= 0 45)" << std::endl;
|
|
ss2 << "(and c c)" << std::endl;
|
|
ss2 << "true" << std::endl;
|
|
parser2.setStreamInput(modes::InputLanguage::SMT_LIB_2_6, ss2, "MyStream2");
|
|
|
|
// parse terms until finished
|
|
Term t;
|
|
do
|
|
{
|
|
t = parser2.nextTerm();
|
|
std::cout << "Parsed term: " << t << std::endl;
|
|
} while (!t.isNull());
|
|
std::cout << "Finished parsing terms" << std::endl;
|
|
}
|