+// -*- C++ -*-
+/**
+ * \file texparser.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author André Pönitz
+ *
+ * Full author contact details are available in file CREDITS.
+ */
#ifndef PARSER_H
#define PARSER_H
-#include "LString.h"
#include <vector>
+#include <string>
+#include <utility>
-enum mode_type {UNDECIDED_MODE, TEXT_MODE, MATH_MODE, MATHTEXT_MODE};
-mode_type asMode(mode_type oldmode, string const & str);
+namespace lyx {
+
+
+enum mode_type {UNDECIDED_MODE, TEXT_MODE, MATH_MODE, MATHTEXT_MODE, TABLE_MODE};
+
+mode_type asMode(mode_type oldmode, std::string const & str);
// These are TeX's catcodes
FLAG_EQUATION = 1 << 9, // next \] leaves the loop
FLAG_SIMPLE2 = 1 << 10, // next \) leaves the loop
FLAG_OPTION = 1 << 11, // read [...] style option
- FLAG_BRACED = 1 << 12 // read {...} style argument
+ FLAG_BRACED = 1 << 12, // read {...} style argument
+ FLAG_CELL = 1 << 13, // read table cell
+ FLAG_TABBING = 1 << 14 // We are inside a tabbing environment
};
///
Token(char c, CatCode cat) : cs_(), char_(c), cat_(cat) {}
///
- Token(string const & cs) : cs_(cs), char_(0), cat_(catIgnore) {}
+ Token(std::string const & cs, CatCode cat) : cs_(cs), char_(0), cat_(cat) {}
///
- string const & cs() const { return cs_; }
- ///
+ std::string const & cs() const { return cs_; }
+ /// Returns the catcode of the token
CatCode cat() const { return cat_; }
///
char character() const { return char_; }
- ///
- string asString() const;
- ///
- string asInput() const;
+ /// Returns the token as string
+ std::string asString() const;
+ /// Returns the token verbatim
+ std::string asInput() const;
private:
///
- string cs_;
+ std::string cs_;
///
char char_;
///
CatCode cat_;
};
-ostream & operator<<(ostream & os, Token const & t);
+std::ostream & operator<<(std::ostream & os, Token const & t);
-//
-// Actual parser class
-//
+/*!
+ * Actual parser class
+ *
+ * The parser parses every character of the inputstream into a token
+ * and classifies the token.
+ * The following transformations are done:
+ * - Consecutive spaces are combined into one single token with CatCode catSpace
+ * - Consecutive newlines are combined into one single token with CatCode catNewline
+ * - Comments and %\n combinations are parsed into one token with CatCode catComment
+ */
class Parser {
public:
///
- Parser(istream & is);
+ Parser(std::istream & is);
+ ///
+ Parser(std::string const & s);
///
int lineno() const { return lineno_; }
void dump() const;
///
- string getArg(char left, char right);
- ///
+ typedef std::pair<bool, std::string> Arg;
+ /*!
+ * Get an argument enclosed by \p left and \p right.
+ * \returns wether an argument was found in \p Arg.first and the
+ * argument in \p Arg.second. \see getArg().
+ */
+ Arg getFullArg(char left, char right);
+ /*!
+ * Get an argument enclosed by \p left and \p right.
+ * \returns the argument (without \p left and \p right) or the empty
+ * string if the next non-space token is not \p left. Use
+ * getFullArg() if you need to know wether there was an empty
+ * argument or no argument at all.
+ */
+ std::string getArg(char left, char right);
+ /*!
+ * \returns getFullArg('[', ']') including the brackets or the
+ * empty string if no argument was found.
+ */
+ std::string getFullOpt();
+ /// \returns getArg('[', ']') including the brackets
+ std::string getOpt();
+ /*!
+ * \returns the contents of the environment \p name.
+ * <tt>\begin{name}</tt> must be parsed already, <tt>\end{name}</tt>
+ * is parsed but not returned.
+ */
+ std::string const verbatimEnvironment(std::string const & name);
+ /// Returns the character of the current token and increments the token position.
char getChar();
///
- void error(string const & msg);
- ///
- void tokenize(istream & is);
+ void error(std::string const & msg);
+ /// Parses \p is into tokens
+ void tokenize(std::istream & is);
///
void push_back(Token const & t);
///
void pop_back();
+ /// The previous token.
+ Token const & prev_token() const;
+ /// The current token.
+ Token const & curr_token() const;
+ /// The next token.
+ Token const & next_token() const;
+ /// Make the next token current and return that.
+ Token const & get_token();
+ /// \return whether the current token starts a new paragraph
+ bool isParagraph() const;
+ /// skips spaces (and comments if \p skip_comments is true)
+ void skip_spaces(bool skip_comments = false);
+ /// puts back spaces (and comments if \p skip_comments is true)
+ void unskip_spaces(bool skip_comments = false);
+ ///
+ void lex(std::string const & s);
///
- Token const & prevToken() const;
- ///
- Token const & nextToken() const;
- ///
- Token const & getToken();
- /// skips spaces if any
- void skipSpaces();
+ bool good() const;
///
- void lex(string const & s);
+ std::string verbatim_item();
///
- bool good() const;
+ std::string verbatimOption();
+ /// resets the parser to initial state
+ void reset();
///
- string verbatimItem();
+ void setCatCode(char c, CatCode cat);
///
- string verbatimOption();
+ CatCode getCatCode(char c) const;
-//private:
+private:
///
int lineno_;
///
- vector<Token> tokens_;
+ std::vector<Token> tokens_;
///
unsigned pos_;
};
+
+
+} // namespace lyx
+
#endif