namespace console {
namespace detail {
+#ifndef DOXYGEN
+
+ ///////////////////////////////////////////////////////////////////////////
+ // append_a
+
struct append_action
{
template <class T, class Value>
template <class T>
inline boost::spirit::ref_value_actor<T, append_action>
append_a(T & ref)
- {
- return boost::spirit::ref_value_actor<T, append_action>(ref);
- }
+ { return boost::spirit::ref_value_actor<T, append_action>(ref); }
template <class T, class Value>
inline boost::spirit::ref_const_ref_actor<T, Value, append_action>
append_a(T & ref, Value const & value)
- {
- return boost::spirit::ref_const_ref_actor<T, Value, append_action>(ref, value);
- }
+ { return boost::spirit::ref_const_ref_actor<T, Value, append_action>(ref, value); }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Grammar
template <class ParseDispatcher>
struct CommandGrammar : boost::spirit::grammar<CommandGrammar<ParseDispatcher> >
special_p ("/(){};"),
// Characters which are returned as punctuation tokens
- punctuation_p (",="),
+ // (only allowed within '()')
+ punctuation_p (",=/{};"),
// Whitespace characters
space_p (" \t\n\r"),
// Syntax summary:
// This is EBNF with some minor tweaks to accommodate C++ syntax
//
- // * and + precede their argument
+ // * and + like EBNF but they precede their argument
// >> is followed by
// ! optional
// a % b match any number of a's separated by b
//
// Aligned to the right at column 50 are semantic actions.
//
- // For clarity, I have used 'ch_p' explicitly throughout even though it is auxiliary
+ // For clarity, I have used 'ch_p' explicitly throughout even though it is optional
// in most cases.
//
// More info is in the Boost.Spirit documentation
>> path
>> eps_p [ self.dispatch(&PD::builtin_cd,
boost::ref(self.context.path)) ]
- | keyword_p("ls")
+ | keyword_p("ls")
>> ! path
>> eps_p [ self.dispatch(&PD::builtin_ls,
boost::ref(self.context.path)) ]
| keyword_p("exit") [ self.dispatch(&PD::builtin_exit) ]
+
+ | keyword_p("help")
+ >> ! path
+ >> eps_p [ self.dispatch(&PD::builtin_help,
+ boost::ref(self.context.path)) ]
;
block
};
};
+
+
+#endif
+
}}}
///////////////////////////////ih.e////////////////////////////////////////