2009-02-23 30 views
1

我想寫一個使用yacc和lex的shell,我遇到了一些I/O轉向器的問題。目前,我可以使用<和>運營商罰款和任何順序,但我的問題是我可以重定向兩次沒有錯誤,如「ls> log> log2」yacc,只應用規則一次

我的規則代碼在下面,任何人都可以給我有關如何解決這個問題的一些提示?謝謝!

io_mod: 
    iomodifier_opt io_mod 
    | 
    ; 

iomodifier_opt: 
    GREAT WORD { 
     printf(" Yacc: insert output \"%s\"\n", $2); 
     Command::_currentCommand._outFile = $2; 
    } 
    | 
    LESS WORD { 
     printf(" Yacc: insert input \"%s\"\n", $2); 
     Command::_currentCommand._inputFile = $2; 
    } 
    | /* can be empty */ 
    ; 

編輯:說我的TA後,我才知道,我其實沒有需要有1只爲我的命令修飾符,而且我居然可以有相同的I/O重定向的多個副本。

+0

這是轉讓的要求嗎?標準shell允許您多次重定向而不出錯,輸出只在最後一個文件中。我不確定你想要這樣做有多現實,但你錯過了>>和<<。 – CTT 2009-02-23 18:39:57

+0

實際上沒有提到我正在做的任務,我只是認爲只能重定向一次會更有意義。 我同意上面的列表不完整,我將在稍後添加其他I/O重定向。 – samoz 2009-02-23 18:51:18

回答

4

有兩種方法:

(1)修改語法,讓你只能有各種改性劑中的一種:

 
io_mod_opt: out_mod in_mod | in_mod out_mod | in_mod | out_mod | ; 

(2)修改條款處理計數修飾符如果有多個錯誤報告錯誤:

 
GREAT_WORD { 
    if (already_have_output_file()) { 
     error("too many output files: \"%s\"\n", $2) 
    } else { 
     /* record output file */ 
    } 
} 

選項(2)似乎會導致更好的錯誤消息和更簡單的語法。

-1

我意識到這可能只是一個練習,學習lexx和yacc,但否則第一個問題是要問爲什麼你想使用lexx和yacc?任何常用的shell命令語言都有一個非常簡單的語法;你使用LALR發生器獲得什麼?

好吧,除了複雜性,難以生成好的錯誤信息和代碼批量,我的意思是。

1

還有第三種方法 - 不要擔心。 Bash(在Cygwin下)不會生成以下錯誤:

ls > x > y 

它創建x然後y並結束寫入y。