简体   繁体   中英

fast string parser C++

I have an idea to make super fast command parser.

I have more than 100 pairs of command - function, and some commands have same prefixes.

Down below there is example of my idea. I can make a program that will generate C++ code like in this example, but i think this can be realized with templates.

I'm not strong in templates. May be some one can help with it?

static const string_view s1{"hello"};
void f1() { cout << "f1" << endl; }
static const string_view s2{"helly"};
void f2() { cout << "f2" << endl; }
static const string_view s3{"hi jo"};
void f3() { cout << "f3" << endl; }
static const string_view s4{"hoyMo"};
void f4() { cout << "f4" << endl; }

void sw(string_view& hw){
    switch(hw.size()){
        case 5: {
            switch(hw[0]){
                case 'h': {
                    switch(hw[1]){
                        case 'e': {
                            switch(hw[2]){
                                case 'l': {
                                    switch(hw[3]){
                                        case 'l': {
                                            switch(hw[4]){
                                                case 'o': {
                                                    f1();
                                                    break;
                                                }
                                                case 'y': {
                                                    f2();
                                                    break;
                                                }
                                                default: cout << "command not found" << endl; break;
                                            }
                                            break;
                                        }
                                        default: cout << "command not found" << endl; break;
                                    }
                                    break;
                                }
                                default: cout << "command not found" << endl; break;
                            }
                            break;
                        }
                        case 'i': {
                            if(hw.substr(2) == s3.substr(2)){
                                f3();
                            }
                            break;
                        }
                        case 'o': {
                            if(hw.substr(2) == s4.substr(2)){
                                f4();
                            }
                            break;
                        }
                        default: cout << "command not found" << endl; break;
                    }
                    break;
                }
                default: cout << "command not found" << endl; break;
            }
            break;
        }
        case 6: {
            //...
            break;
        }
        default: cout << "command not found" << endl; break;
    }
}

int main(){
    string_view myCommand("hi jo");
    sw(myCommand);
    string_view myCommand2("hoyMo");
    sw(myCommand2);
    string_view myCommand3("ha ha");
    sw(myCommand3);
}

You should probably be using a parser library, such as Boost.Spirit . This wil allow you to write simple code, like

  string("hello")
| string("helly")
| string("hi jo")
| string("hoyMo")

and do all the heavy lifting for you to generate a parser that will probably be faster than something you would write yourself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM