mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 14:15:49 -06:00
98 lines
3 KiB
C++
98 lines
3 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// pgScript - PostgreSQL Tools
|
|
//
|
|
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
|
|
// This software is released under the PostgreSQL Licence
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#ifndef PGSDRIVER_H_
|
|
#define PGSDRIVER_H_
|
|
|
|
#include "pgscript/pgScript.h"
|
|
#include "pgscript/utilities/pgsScanner.h"
|
|
#include "pgscript/parser.tab.hh"
|
|
|
|
// Forward declaration
|
|
class pgsContext;
|
|
|
|
// Forward declaration
|
|
class pgsProgram;
|
|
|
|
// Forward declaration
|
|
class pgsThread;
|
|
|
|
/** The pgscript namespace is used to encapsulate the three parser classes
|
|
* pgscript::pgsParser, pgscript::pgsScanner and pgscript::pgsDriver */
|
|
namespace pgscript
|
|
{
|
|
|
|
/** The pgsDriver class brings together all components. It creates an instance of
|
|
* the pgsParser and pgsScanner classes and connects them. Then the input stream is
|
|
* fed into the scanner object and the parser gets its token
|
|
* sequence. Furthermore the driver object is available in the grammar rules as
|
|
* a parameter. Therefore the driver class contains a reference to the
|
|
* structure into which the parsed data is saved. */
|
|
class pgsDriver
|
|
{
|
|
public:
|
|
/// Construct a new parser driver context
|
|
pgsDriver(class pgsContext &_context, class pgsProgram &_program,
|
|
class pgsThread &_thread);
|
|
|
|
/// Destroy parser
|
|
~pgsDriver();
|
|
|
|
/// Enable debug output in the flex scanner
|
|
bool trace_scanning;
|
|
|
|
/// Enable debug output in the bison parser
|
|
bool trace_parsing;
|
|
|
|
/** Invoke the scanner and parser for a stream.
|
|
* @param in input stream
|
|
* @return true if successfully parsed
|
|
*/
|
|
bool parse_stream(std::istream &in);
|
|
|
|
/** Invoke the scanner and parser on an input string.
|
|
* @param input input string
|
|
* @return true if successfully parsed
|
|
*/
|
|
bool parse_string(const wxString &input);
|
|
|
|
/** Invoke the scanner and parser on a file. Use parse_stream with a
|
|
* std::ifstream if detection of file reading errors is required.
|
|
* @param filename input file name
|
|
* @param conv multi-byte string converter
|
|
* @return true if successfully parsed
|
|
*/
|
|
bool parse_file(const wxString &filename, wxMBConv &conv = wxConvLocal);
|
|
|
|
// To demonstrate pure handling of parse errors, instead of
|
|
// simply dumping them on the standard error output, we will pass
|
|
// them to the driver using the following two member functions.
|
|
|
|
/** Error handling with associated line number. This can be modified to
|
|
* output the error e.g. to a dialog box. */
|
|
void error(const class location &l, const wxString &m);
|
|
|
|
/** Pointer to the current lexer instance, this is used to connect the
|
|
* parser to the scanner. It is used in the yylex macro. */
|
|
class pgsScanner *lexer;
|
|
|
|
/** Reference to the context filled during parsing of the expressions. */
|
|
class pgsContext &context;
|
|
|
|
/** Contains the list of statements to execute. */
|
|
class pgsProgram &program;
|
|
|
|
/** The thread in which this driver is included. */
|
|
class pgsThread &thread;
|
|
};
|
|
|
|
} // namespace pgscript
|
|
|
|
#endif // PGSDRIVER_H_
|