X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FConsole%2FParse.ih;h=4f0569f59ec01dfc453ea39e97eae3e0b8cec0ce;hb=4195e3fc4bb545f2f7921396e2aec77edaa8c8c3;hp=38b9fc924edc073385e53fbff55e2514b2e4eb44;hpb=a22f6d21df6c911d65f76d7731bcf92b1906bb09;p=senf.git diff --git a/Utils/Console/Parse.ih b/Utils/Console/Parse.ih index 38b9fc9..4f0569f 100644 --- a/Utils/Console/Parse.ih +++ b/Utils/Console/Parse.ih @@ -78,6 +78,16 @@ namespace detail { ParseDispatcher & dispatcher; + ////////////////////////////////////////////////////////////////////////// + // charachter sets + + static boost::spirit::chset<> special_p; + static boost::spirit::chset<> punctuation_p; + static boost::spirit::chset<> space_p; + static boost::spirit::chset<> invalid_p; + static boost::spirit::chset<> word_p; + static boost::spirit::distinct_parser<> keyword_p; + /////////////////////////////////////////////////////////////////////////// // Errors @@ -104,33 +114,8 @@ namespace detail { punctuation, hexbyte, balanced_tokens, simple_argument, complex_argument, builtin, skip, statement, relpath, abspath, arguments, group_start, group_close, statement_end, opt_path; - boost::spirit::chset<> special_p, punctuation_p, space_p, invalid_p, word_p; - boost::spirit::distinct_parser<> keyword_p; - - definition(CommandGrammar const & self) : - - // Characters with a special meaning within the parser - special_p ("/(){};\""), - - // Additional characters which are returned as punctuation tokens - // (only allowed within '()'). - punctuation_p (",="), - - // Whitespace characters - space_p (" \t\n\r"), - - // Invalid characters: All chars below \x20 (space) which are not space_p - // (don't put a \0 in the chset<> argument *string* ...) - invalid_p ( (boost::spirit::chset<>('\0') - | boost::spirit::chset<>("\x01-\x20")) - space_p ), - - // Valid word characters - word_p ( - boost::spirit::anychar_p - special_p - punctuation_p - space_p - invalid_p), - - // Keywords must not be followed by a word char or '/' - keyword_p ( word_p | boost::spirit::ch_p('/') ) + definition(CommandGrammar const & self) { using namespace boost::spirit; using namespace ::phoenix; @@ -203,14 +188,14 @@ namespace detail { ; builtin - = keyword_p("cd") + = self.keyword_p("cd") >> path_expected(path) >> eps_p [ bind(&PD::builtin_cd)(d_, path_) ] - | keyword_p("ls") + | self.keyword_p("ls") >> ! path >> eps_p [ bind(&PD::builtin_ls)(d_, path_) ] - | keyword_p("exit") [ bind(&PD::builtin_exit)(d_) ] - | keyword_p("help") + | self.keyword_p("exit") [ bind(&PD::builtin_exit)(d_) ] + | self.keyword_p("help") >> ! path >> eps_p [ bind(&PD::builtin_help)(d_, path_) ] ; @@ -316,7 +301,7 @@ namespace detail { | ch_p(';') [ token_ = construct_( Token::CommandTerminator, ";") ] - | punctuation_p [ token_ = construct_( + | self.punctuation_p [ token_ = construct_( Token::OtherPunctuation, construct_(1u, arg1)) ] ; @@ -324,7 +309,7 @@ namespace detail { word // Returns value in context.token = lexeme_d [ - (+ word_p) [ str_ = construct_(arg1, arg2) ] + (+ self.word_p) [ str_ = construct_(arg1, arg2) ] ] >> eps_p [ token_ = construct_( Token::Word, @@ -347,7 +332,7 @@ namespace detail { ; skip - = space_p | comment_p('#') + = self.space_p | comment_p('#') ; /////////////////////////////////////////////////////////////////// @@ -381,6 +366,19 @@ namespace detail { }; }; + template boost::spirit::chset<> CommandGrammar::special_p ( + "/(){};\""); + template boost::spirit::chset<> CommandGrammar::punctuation_p ( + ",="); + template boost::spirit::chset<> CommandGrammar::space_p ( + " \t\n\r"); + template boost::spirit::chset<> CommandGrammar::invalid_p ( + (boost::spirit::chset<>('\0') | boost::spirit::chset<>("\x01-\x20")) - space_p ); + template boost::spirit::chset<> CommandGrammar::word_p ( + boost::spirit::anychar_p - special_p - punctuation_p - space_p - invalid_p); + template boost::spirit::distinct_parser<> CommandGrammar::keyword_p ( + word_p | boost::spirit::ch_p('/')); + #endif }}}