returned as punctuation tokens
<table class="senf">
- <tr><td>/</td><td>path component separator</td></tr>
- <tr><td>( )</td><td>argument grouping</td></tr>
- <tr><td>{ }</td><td>directory grouping</td></tr>
- <tr><td>;</td><td>command terminator</td></tr>
- <tr><td>, =</td><td>punctuation tokens</td></tr>
+ <tr><td>#</td><td>Comments are marked with '#' and continue to the end of the line</td></tr>
+ <tr><td>/</td><td>path component separator</td></tr>
+ <tr><td>( )</td><td>argument grouping</td></tr>
+ <tr><td>{ }</td><td>directory grouping</td></tr>
+ <tr><td>;</td><td>command terminator</td></tr>
+ <tr><td>, =</td><td>punctuation tokens</td></tr>
</table>
\subsection console_basic Basic elements
namespace senf {
namespace console {
+ namespace detail { class FilePositionWithIndex; }
+
namespace detail { struct ParserAccess; }
/** \brief Single argument token
};
Token(); ///< Create empty token
- Token(TokenType type, std::string token); ///< Create token with given type and value
+ Token(TokenType type, std::string token);
+ ///< Create token with given type and value
+ Token(TokenType type, std::string token, detail::FilePositionWithIndex const & pos);
+ ///< Create token with given type and value
std::string const & value() const; ///< String value of token
TokenType type() const; ///< Token type
+ unsigned line() const; ///< Line number of token in source
+ unsigned column() const; ///< Column number of token in source
+ unsigned index() const; ///< Index (char count) of token in source
+
bool is(unsigned tokens) const; ///< Check, whether tokens type matches \a tokens
/**< \a tokens is a bit-mask of token types to check. */
private:
TokenType type_;
std::string token_;
+ unsigned line_;
+ unsigned column_;
+ unsigned index_;
};
std::ostream & operator<<(std::ostream & os, Token const & token);
enum BuiltinCommand { NoBuiltin,
BuiltinCD,
BuiltinLS,
+ BuiltinLL,
+ BuiltinLR,
BuiltinPUSHD,
BuiltinPOPD,
BuiltinEXIT,
of the command). The argument tokens are written into
\a info. */
+ void parsePath(std::string const & path, ParseCommandInfo & info);
+ ///< Parse \a path
+ /**< parsePath() parses the string \a path as an arbitrary
+ command path. The result is written into \a info. */
+
std::string::size_type parseIncremental(std::string const & commands, Callback cb);
///< Incremental parse
/**< An incremental parse will parse all complete statements
to be terminated explicitly. This means, that the
last ';' is \e not optional in this case. */
+ static bool isSpecialChar(char ch); ///< Check, if \a ch is a special character
+ static bool isPunctuationChar(char ch); ///< Check, if \a ch is a punctuation character
+ static bool isSpaceChar(char ch); ///< Check, if \a ch is a space character
+ static bool isInvalidChar(char ch); ///< Check, if \a ch is an invalid character
+ static bool isWordChar(char ch); ///< Check, if \a ch is a word character
+
/** \brief Exception thrown when the parser detects an error */
struct ParserErrorException : public SyntaxErrorException
{ explicit ParserErrorException(std::string const & msg) : SyntaxErrorException(msg) {} };