Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Morgan Deters, Andres Noetzli 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS 8 : : * in the top-level source directory and their institutional affiliations. 9 : : * All rights reserved. See the file COPYING in the top-level source 10 : : * directory for licensing information. 11 : : * **************************************************************************** 12 : : * 13 : : * Base class for parsing. 14 : : */ 15 : : 16 : : #include "cvc5parser_public.h" 17 : : 18 : : #ifndef CVC5__PARSER__PARSER_H 19 : : #define CVC5__PARSER__PARSER_H 20 : : 21 : : #include <cvc5/cvc5.h> 22 : : 23 : : #include <list> 24 : : #include <memory> 25 : : 26 : : #include "parser/input.h" 27 : : #include "parser/parser_state.h" 28 : : 29 : : namespace cvc5 { 30 : : namespace parser { 31 : : 32 : : class Cmd; 33 : : class SymManager; 34 : : class Lexer; 35 : : 36 : : /** 37 : : * A parser that uses the Lexer for lexing. It is used as a callback 38 : : * for error reporting. Its main methods are those that set up the input, 39 : : * nextCommand for parsing commands and nextExpression for parsing terms. 40 : : */ 41 : : class Parser : public ParserStateCallback 42 : : { 43 : : public: 44 : : Parser(Solver* solver, SymManager* sm); 45 : 22958 : virtual ~Parser() {} 46 : : /** 47 : : * Set the logic 48 : : * 49 : : * @param name The name of the logic. 50 : : */ 51 : : virtual void setLogic(const std::string& name); 52 : : /** Set the input for the given file. 53 : : * 54 : : * @param filename the input filename 55 : : */ 56 : : void setFileInput(const std::string& filename); 57 : : 58 : : /** Set the input for the given stream. 59 : : * 60 : : * @param input the input stream 61 : : * @param name the name of the stream, for use in error messages 62 : : */ 63 : : void setStreamInput(std::istream& input, const std::string& name); 64 : : 65 : : /** Set the input for the given string 66 : : * 67 : : * @param input the input string 68 : : * @param name the name of the stream, for use in error messages 69 : : */ 70 : : void setStringInput(const std::string& input, const std::string& name); 71 : : 72 : : /** 73 : : * Parse and return the next command. 74 : : */ 75 : : std::unique_ptr<Cmd> nextCommand(); 76 : : 77 : : /** Parse and return the next expression. */ 78 : : Term nextTerm(); 79 : : 80 : : /** Is this parser done reading input? */ 81 : : bool done() const; 82 : : 83 : : /** Issue a warning to the user. */ 84 : : void warning(const std::string& msg) override; 85 : : /** Raise a parse error with the given message. */ 86 : : void parseError(const std::string& msg) override; 87 : : /** Unexpectedly encountered an EOF */ 88 : : void unexpectedEOF(const std::string& msg) override; 89 : : 90 : : /** make flex parser from language string */ 91 : : static std::unique_ptr<Parser> mkParser(modes::InputLanguage lang, 92 : : Solver* solver, 93 : : SymManager* sm); 94 : : 95 : : protected: 96 : : /** Initialize input */ 97 : : void initializeInput(const std::string& name); 98 : : 99 : : /** Sets the done flag */ 100 : 713623 : void setDone(bool done = true) { d_done = done; } 101 : : /** 102 : : * Parse and return the next command. 103 : : * NOTE: currently memory management of commands is handled internally. 104 : : */ 105 : : virtual std::unique_ptr<Cmd> parseNextCommand() = 0; 106 : : 107 : : /** Parse and return the next expression. */ 108 : : virtual Term parseNextTerm() = 0; 109 : : /** Solver */ 110 : : Solver* d_solver; 111 : : /** Symbol manager */ 112 : : SymManager* d_sm; 113 : : /** The lexer we are using */ 114 : : Lexer* d_lex; 115 : : /** The flex input */ 116 : : std::unique_ptr<Input> d_flexInput; 117 : : /** Are we done */ 118 : : bool d_done; 119 : : }; 120 : : 121 : : } // namespace parser 122 : : } // namespace cvc5 123 : : 124 : : #endif /* CVC5__PARSER__SMT2_H */