X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FConsole%2FParse.ih;h=00745ccecdfc89bf7a9ee474b00c7e3332e2cba7;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=4f0569f59ec01dfc453ea39e97eae3e0b8cec0ce;hpb=4195e3fc4bb545f2f7921396e2aec77edaa8c8c3;p=senf.git diff --git a/Utils/Console/Parse.ih b/Utils/Console/Parse.ih index 4f0569f..00745cc 100644 --- a/Utils/Console/Parse.ih +++ b/Utils/Console/Parse.ih @@ -43,6 +43,30 @@ namespace detail { #ifndef DOXYGEN + struct FilePositionWithIndex + : public boost::spirit::file_position + { + int index; + + FilePositionWithIndex(std::string const & file_ = std::string(), + int line_ = 1, int column_ = 1, int index_ = 0) + : boost::spirit::file_position (file_, line_, column_), index (index_) + {} + + bool operator==(const FilePositionWithIndex & fp) const + { + return boost::spirit::file_position::operator==(fp) && index == fp.index; + } + }; + + struct PositionOf { + template struct result { typedef FilePositionWithIndex type; }; + template FilePositionWithIndex operator()(A1 & a1) { return a1.get_position(); } + FilePositionWithIndex operator()(char const * a1) { return FilePositionWithIndex(); } + }; + + ::phoenix::function const positionOf; + /////////////////////////////////////////////////////////////////////////// // Grammar @@ -64,6 +88,7 @@ namespace detail { std::vector path; char ch; Token token; + FilePositionWithIndex pos; }; Context & context; @@ -122,11 +147,12 @@ namespace detail { using namespace senf::phoenix; typedef ParseDispatcher PD; - actor< variable< char > > ch_ (self.context.ch); - actor< variable< std::string > > str_ (self.context.str); - actor< variable< std::vector > > path_ (self.context.path); - actor< variable< Token > > token_ (self.context.token); - actor< variable< ParseDispatcher > > d_ (self.dispatcher); + actor< variable< char > > ch_ (self.context.ch); + actor< variable< std::string > > str_ (self.context.str); + actor< variable< std::vector > > path_ (self.context.path); + actor< variable< Token > > token_ (self.context.token); + actor< variable< FilePositionWithIndex > > pos_ (self.context.pos); + actor< variable< ParseDispatcher > > d_ (self.dispatcher); assertion end_of_statement_expected (EndOfStatementExpected); assertion path_expected (PathExpected); @@ -194,6 +220,9 @@ namespace detail { | self.keyword_p("ls") >> ! path >> eps_p [ bind(&PD::builtin_ls)(d_, path_) ] + | self.keyword_p("lr") + >> ! path + >> eps_p [ bind(&PD::builtin_lr)(d_, path_) ] | self.keyword_p("exit") [ bind(&PD::builtin_exit)(d_) ] | self.keyword_p("help") >> ! path @@ -224,7 +253,7 @@ namespace detail { ; string // Returns value in context.token - = eps_p [ clear(str_) ] + = eps_p [ pos_ = positionOf(arg1) ][ clear(str_) ] >> lexeme_d [ ch_p('"') @@ -234,17 +263,19 @@ namespace detail { ) >> quote_expected(ch_p('"')) [ token_ = construct_(Token::BasicString, - str_) ] + str_, + pos_) ] ] ; hexstring // Returns value in context.token - = eps_p [ clear(str_) ] + = eps_p [ pos_ = positionOf(arg1) ][ clear(str_) ] >> "x\"" >> * ( hexbyte - ch_p('"') ) >> quote_expected(ch_p('"')) [ token_ = construct_(Token::HexString, - str_) ] + str_, + pos_) ] ; opt_path @@ -270,15 +301,19 @@ namespace detail { ; balanced_tokens - = ch_p('(') [ token_ = construct_( + = eps_p [ pos_ = positionOf(arg1) ] + >> ch_p('(') [ token_ = construct_( Token::ArgumentGroupOpen, - "(") ] + "(", + pos_) ] [ bind(&PD::pushToken)(d_, token_) ] >> * token + >> eps_p [ pos_ = positionOf(arg1) ] >> closing_paren_expected(ch_p(')')) [ token_ = construct_( Token::ArgumentGroupClose, - ")") ] + ")", + pos_) ] [ bind(&PD::pushToken)(d_, token_) ] ; @@ -289,31 +324,37 @@ namespace detail { ; punctuation // Returns value in context.str - = ch_p('/') [ token_ = construct_( - Token::PathSeparator, - "/") ] - | ch_p('{') [ token_ = construct_( - Token::DirectoryGroupOpen, - "{") ] - | ch_p('}') [ token_ = construct_( - Token::DirectoryGroupClose, - "}") ] - | ch_p(';') [ token_ = construct_( - Token::CommandTerminator, - ";") ] - | self.punctuation_p [ token_ = construct_( - Token::OtherPunctuation, - construct_(1u, arg1)) ] + = eps_p [ pos_ = positionOf(arg1) ] + >> ( + ch_p('/') [ token_ = construct_( + Token::PathSeparator, + "/") ] + | ch_p('{') [ token_ = construct_( + Token::DirectoryGroupOpen, + "{") ] + | ch_p('}') [ token_ = construct_( + Token::DirectoryGroupClose, + "}") ] + | ch_p(';') [ token_ = construct_( + Token::CommandTerminator, + ";") ] + | self.punctuation_p [ token_ = construct_( + Token::OtherPunctuation, + construct_(1u, arg1), + pos_) ] + ) ; word // Returns value in context.token - = lexeme_d + = eps_p [ pos_ = positionOf(arg1) ] + >> lexeme_d [ (+ self.word_p) [ str_ = construct_(arg1, arg2) ] ] >> eps_p [ token_ = construct_( Token::Word, - str_) ] + str_, + pos_) ] ; hexbyte