当我的tokenizer识别出令牌时,如何执行其他操作?

时间:2016-02-01 03:07:43

标签: c++ tokenize

我编写了一个简单的标记生成器,它将命令行拆分成单独的行,每行包含一个单词。我想... ...

  • 如果命令行的第一个单词是"退出"

  • ,请关闭程序
  • 识别" Pickup"," Save"和" Go"等指令。然后编译器将查找下一个标记。

我的想法是使用带有大小写的简单开关来检查这些命令,但我无法弄清楚将它放在哪里。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char command[256];
int commandIndex;
char token[32];

int isWhiteSpace(char character) {
    if (character == ' ') { 
        return 1;
    }
    else if(character == '\t') { 
        return 1; 
    } 
    else if(character < ' ') {
        return 1;
    }
    else { 
        return 0; 
    }
} char* getToken() {
    int index = 0; // Skip white spaces
    while(commandIndex<256 && isWhiteSpace(command[commandIndex])) {
        commandIndex ++;
    } // If at end of line return empty token
    if(commandIndex>=256) {
        token[0] = 0;
        return token;
    } // Capture token
    while(commandIndex<256 && !isWhiteSpace(command[commandIndex])) { 
        token[index] = command[commandIndex];
        index++;
        commandIndex ++;
    }       
    token[index] = 0;
    return token;
} 
void main() {
    printf("Zeta - Version 2.0\n");
    while(1) {
        printf("Command: ");
        gets_s(command);
        commandIndex = 0;
        char* token = getToken();
        while (strcmp(token,"") != 0) {
            printf("%s\n", token);
            token = getToken();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

对main中的循环进行一点重组就可以了。

int main() {
    printf("Zeta - Version 2.0\n");
    bool done = false;
    while (!done) {
        printf("Command: ");
        gets_s(command);
        commandIndex = 0;
        char* token = getToken();
        if (strcmp(token, "quit") == 0) {
            done = true;
        } else if (strcmp(token, "pickup") == 0) {
            doPickup();
        } else if (strcmp(token, "save") == 0) {
            char * filename = getToken();
            doSave(filename);
        } ...
    }
    return 0;
}

您不能将switch语句与字符串一起使用,因此您只需使用一堆if ... else if ...语句来检查每个命令。还有其他方法,但是这个方法需要对您已有的代码进行最少的更改。

在示例中,在"save"的处理下,我展示了如何再次调用getToken以在同一命令行上获取下一个标记。

(请注意,我还修复了main的返回值。有些编译器会让您使用void,但这不是标准的,所以如果你不这样做,那么它是最好的#&# 39; t那样做。)