#define LEXER_H
#include "support/strfwd.h"
-
+#include <string>
namespace lyx {
namespace support { class FileName; }
-class PushPopHelper;
-
/** A helper structure to describe a keyword for the Lexer.
- Usually used bundled in C style arrays and passed to the
+ Usually used bundled in C style arrays and passed to the
Lexer using a LexerKeywordTable object.
*/
struct LexerKeyword
{
public:
/// initialize Lexer with no special keywords.
- Lexer();
+ Lexer();
/// initialize Lexer with a bunch of keywords
template<int N> Lexer(LexerKeyword (&table)[N])
- : pimpl_(0) { init(table, N); }
+ : pimpl_(0), lastReadOk_(false) { init(table, N); }
///
~Lexer();
/// returns a lex code
int lex();
- /** Just read the next word. If esc is true remember that
- some chars might be escaped: "\ at least
- */
+ /// Read the next string, as delimited by double quotes or
+ /// whitespace. If esc is true, then we remember that some chars
+ /// might be escaped: \" at least.
bool next(bool esc = false);
- /** Read next token. This one is almost the same as next,
- but it will consider " as a regular character and always
- split a word if it contains a backslash.
- */
+ /// Read next token. This one is almost the same as next(),
+ /// but it will consider " as a regular character and always
+ /// split a word if it contains a backslash.
bool nextToken();
+
+ /// Puts the rest of the line in the buffer, where it will
+ /// be available via getString() or getDocString().
+ bool eatLine();
+
/// Push a token, that next token got from lyxlex.
void pushToken(std::string const &);
///
double getFloat() const;
///
- std::string const getString() const;
-
+ std::string const getString(bool trim = false) const;
///
- docstring const getDocString() const;
-
- /** Get a long string, ended by the tag `endtag'.
+ docstring const getDocString(bool trim = false) const;
+ /** Get a long string, ended by the tag `endtoken'.
This string can span several lines. The first line
serves as a template for how many spaces the lines
are indented. This much white space is skipped from
each following line. This mechanism does not work
perfectly if you use tabs.
*/
- std::string const getLongString(std::string const & endtag);
-
- ///
- bool eatLine();
+ docstring getLongString(docstring const & endtoken);
/// Pushes a token list on a stack and replaces it with a new one.
template<int N> void pushTable(LexerKeyword (&table)[N])
/// Quotes a string so that reading it again with Lexer::next(true)
/// gets the original string
static std::string quoteString(std::string const &);
+ /// Quotes a docstring so that reading it again with Lexer::next(true)
+ /// gets the original string
+ static docstring quoteString(docstring const &);
private:
/// noncopyable