Fix `(set-info <sexpr>)` parsing and printing bugs. (#7427)
authorAbdalrhman Mohamed <32971963+abdoo8080@users.noreply.github.com>
Thu, 28 Oct 2021 11:26:49 +0000 (06:26 -0500)
committerGitHub <noreply@github.com>
Thu, 28 Oct 2021 11:26:49 +0000 (11:26 +0000)
Given
```smt2
(set-info :source (0 1 True False x ""))
```
`cvc5` currently prints the command below with `-o raw-benchmark`
```smt2
(set-info : |(0 1 True False x )|)
```
This PR ensures that `cvc5` correctly prints the command by
- Parsing and storing keywords eagerly before parsing their values.
- Removing pre-processing steps done to symbols and string literals.

src/parser/smt2/Smt2.g
src/printer/smt2/smt2_printer.cpp
test/regress/regress0/bug522.smt2
test/regress/regress0/options/ast-and-sexpr.smt2
test/regress/regress1/quantifiers/bi-artm-s.smt2
test/regress/regress2/quantifiers/cee-event-wrong-sat.smt2

index e3aee250ec6dac2e3164e4e4007896ade8564844..696eb6ad4ce41833882131fc738509d21ef1047c 100644 (file)
@@ -735,10 +735,8 @@ setInfoInternal[std::unique_ptr<cvc5::Command>* cmd]
   std::string name;
   api::Term sexpr;
 }
-  : KEYWORD symbolicExpr[sexpr]
-    { name = AntlrInput::tokenText($KEYWORD);
-      cmd->reset(new SetInfoCommand(name.c_str() + 1, sexprToString(sexpr)));
-    }
+  : keyword[name] symbolicExpr[sexpr]
+    { cmd->reset(new SetInfoCommand(name.c_str() + 1, sexprToString(sexpr))); }
   ;
 
 setOptionInternal[std::unique_ptr<cvc5::Command>* cmd]
@@ -1247,8 +1245,12 @@ simpleSymbolicExprNoKeyword[std::string& s]
     { s = AntlrInput::tokenText($HEX_LITERAL); }
   | BINARY_LITERAL
     { s = AntlrInput::tokenText($BINARY_LITERAL); }
-  | str[s,false]
-  | symbol[s,CHECK_NONE,SYM_SORT]
+  | SIMPLE_SYMBOL
+    { s = AntlrInput::tokenText($SIMPLE_SYMBOL); }
+  | QUOTED_SYMBOL
+    { s = AntlrInput::tokenText($QUOTED_SYMBOL); }
+  | STRING_LITERAL
+    { s = AntlrInput::tokenText($STRING_LITERAL); }
   | tok=(ASSERT_TOK | CHECK_SAT_TOK | CHECK_SAT_ASSUMING_TOK | DECLARE_FUN_TOK
         | DECLARE_SORT_TOK
         | DEFINE_FUN_TOK | DEFINE_FUN_REC_TOK | DEFINE_FUNS_REC_TOK
@@ -1839,16 +1841,16 @@ attribute[cvc5::api::Term& expr, cvc5::api::Term& retExpr]
       api::Term n = SOLVER->mkInteger(sIntLit.str());
       retExpr = MK_TERM(api::INST_ATTRIBUTE, keyword, n);
     }
-  | tok=( ATTRIBUTE_QUANTIFIER_ID_TOK ) symbolicExpr[sexpr]
+  | tok=( ATTRIBUTE_QUANTIFIER_ID_TOK ) symbol[s,CHECK_UNDECLARED,SYM_VARIABLE]
     {
       api::Term keyword = SOLVER->mkString("qid");
-      api::Term name = SOLVER->mkString(sexprToString(sexpr));
+      api::Term name = SOLVER->mkString(s);
       retExpr = MK_TERM(api::INST_ATTRIBUTE, keyword, name);
     }
-  | ATTRIBUTE_NAMED_TOK symbolicExpr[sexpr]
+  | ATTRIBUTE_NAMED_TOK symbol[s,CHECK_UNDECLARED,SYM_VARIABLE]
     {
       // notify that expression was given a name
-      PARSER_STATE->notifyNamedExpression(expr, sexprToString(sexpr));
+      PARSER_STATE->notifyNamedExpression(expr, s);
     }
   ;
 
index ccb2ed2c6a737a631399d44634e79edcdfb4a86d..171f8e524e815a6822a08eb3f0f5d2da73c90d65 100644 (file)
@@ -1617,8 +1617,7 @@ void Smt2Printer::toStreamCmdSetInfo(std::ostream& out,
                                      const std::string& flag,
                                      const std::string& value) const
 {
-  out << "(set-info :" << flag << " " << cvc5::quoteSymbol(value) << ")"
-      << std::endl;
+  out << "(set-info :" << flag << " " << value << ")" << std::endl;
 }
 
 void Smt2Printer::toStreamCmdGetInfo(std::ostream& out,
index 3a9ea0eaa9512a1540be84c7a234479738505082..ad6e526a83a1ba95e0689e74252b3f4f584c4468 100644 (file)
@@ -1,6 +1,6 @@
 ; EXPECT: sat
 ; EXPECT: sat
-(set-option :incremental "true")
+(set-option :incremental true)
 (set-logic QF_UF)
 
 (push 1)
index 2a464571c9fbf92edeb552db3cd925e274441de8..41012f88875a56f9ae196d10984de93ef7dd93d5 100644 (file)
@@ -13,5 +13,6 @@
 (get-option :command-verbosity)
 ; There is no SMT option to get the verbosity of a specific command
 
-(set-info :source (0 1 True False x ""))
+(set-info :source (true false (- 15) 15 15.0 #b00001111 #x0f x |x 
+"| "" """"))
 (get-info :status)
index af8ee945d294d3895886e49f3bb75b8d3a846186..9c6b821b5e8d614e6727bbacc7cc290ae1abc1ab 100644 (file)
@@ -1,6 +1,6 @@
 ; COMMAND-LINE: --fmf-bound-lazy
 ; EXPECT: unsat
-(set-option :incremental "false")
+(set-option :incremental false)
 (set-info :status unsat)
 (set-logic ALL)
 (declare-fun Y () String)
index c0b3aac7cd0c4c98fd88341e56a7b59e811da125..4a132a39b6e7d8a262e8ebc6169cf4fc45a16f23 100644 (file)
@@ -1,5 +1,5 @@
-; COMMAND-LINE: --full-saturate-quant --ee-mode=distributed
-; COMMAND-LINE: --full-saturate-quant --ee-mode=central
+; COMMAND-LINE: -q --full-saturate-quant --ee-mode=distributed
+; COMMAND-LINE: -q --full-saturate-quant --ee-mode=central
 ; EXPECT: unsat
 (set-logic ALL)
 (set-info :status unsat)
@@ -23,7 +23,7 @@
 (declare-fun $Event_EventHandleGenerator_type_value () T@$TypeValue)
 (assert (= 0 (|l#R| $EmptyValueArray)))
 (assert (forall ((v1 T@$Value) (v2 T@$Value)) (= ($IsEqual_stratified v1 v2) (or (= v1 v2) (forall ((i Int)) (or (> 0 i) (>= i (|l#R| (|v#V| v1))) ($IsEqual_stratified (sel (|v#R| (|v#V| v1)) i) (sel (|v#R| (|v#V| v2)) i))))))))
-(assert (forall ((m@@0 T@M) (a@@0 T@$Value)) (! (or (not (is-D a@@0)) (and (is-I (sel (|v#R| (|v#V| (s (|contents#M| m@@0) (G $Event_EventHandleGenerator_type_value (|a#D| a@@0))))) $Event_EventHandleGenerator_counter)) (forall ((x@@10 Int)) (or (> x@@10 0) (= E (sel (|v#R| (|v#V| (s (|contents#M| m@@0) (G $LibraAccount_T_type_value (|a#D| a@@0))))) x@@10)))))) :qid :skolemid)))
+(assert (forall ((m@@0 T@M) (a@@0 T@$Value)) (! (or (not (is-D a@@0)) (and (is-I (sel (|v#R| (|v#V| (s (|contents#M| m@@0) (G $Event_EventHandleGenerator_type_value (|a#D| a@@0))))) $Event_EventHandleGenerator_counter)) (forall ((x@@10 Int)) (or (> x@@10 0) (= E (sel (|v#R| (|v#V| (s (|contents#M| m@@0) (G $LibraAccount_T_type_value (|a#D| a@@0))))) x@@10)))))) :qid || :skolemid ||)))
 (declare-fun |Select_[$Location]$bool| (b T@$Location) Bool)
 (declare-fun $m@@0 () T@M)
 (declare-fun $abort_flag@2 () Bool)