我正在开发一个基本的unix shell,我很自豪地说它工作得很棒我在整个开发过程中学到了很多东西。有一个我缺少的功能,我似乎无法绕过如何让它工作,也许我的大脑被烧毁了。
如果我收到以下输入:
回声“Hello World”
我需要解析输入,以便双引号参数被认为是命令的一个参数,而不是两个单独的参数。
我想要实现这个的方法是,我需要一种方法来检测参数中是否有2个引号。如果我们找到它们,我们将需要一个单独的解析函数来处理它们。
我已经包含了我的解析函数,因为我认为这是魔术需要发生的地方。非常感谢任何建议。
//parse
char ** parse(char *input){
char *token;
char **args;
args = malloc (MAX_SIZE*sizeof(char));
int i = 1;
token = strtok(input, " \n\t()<>|&;");
args[0] = token; //this is the command
token = strtok(NULL, " \n\t()<>|&;");
while (token != NULL){
args[i] = token; // these are the arguments
i++;
token = strtok(NULL, " \n\t()<>|&;");
}
args[i] = NULL; //end the array with NULL (required for execvp)
return args;
}
答案 0 :(得分:0)
我建议不要在parse
函数中嵌入ad-hoc词法分析器,而是使用lex
等生成一个,或者2)手动编码。如果您使用基于正则表达式的词法分析器生成器,则可以使用"[^"]*"
之类的规则将双引号字符串作为单个标记。如果您希望能够使用反斜杠来转义双引号,则可以使用"(\.|[^\"])*"
之类的规则。