2013-12-15 18 views
1

我正在研究一個基本的unix shell,我很自豪地說它工作的很棒,我在整個開發過程中學到了很多東西。我缺少一個功能,我似乎無法圍繞如何使它工作,也許我的大腦被燒壞了。編寫我自己的基本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; 
} 
+2

我會提供'strtok'在這裏完全不足;例如它不正確處理'foo「bar

+0

我們的外殼可以正確處理重定向和管道。我的意思不是:) –

+0

我的意思是,你上面的'strtok'代碼將根據**引用的字符串**內的標記** –

回答

0

而不是在parse功能嵌入的ad-hoc詞法分析器,我建議:1)用lex或類似物生成一個,或2)手工編碼之一。如果您使用基於正則表達式的詞法分析器生成器,則可以使用像"[^"]*"這樣的規則將雙引號字符串作爲單個令牌進行lexed。如果您希望能夠使用反斜槓來避免雙引號,則可以使用像"(\.|[^\"])*"這樣的規則。