1

yaccとlexを使用してシェルを作成しようとしていますが、I/Oリダイレクタでいくつかの問題が発生しています。現在、<および>演算子は問題なく任意の順序で使用できますが、問題は、「ls>log>log2」などのエラーなしで2回リダイレクトできることです。

私のルールコードは以下のとおりですが、これを修正するためのヒントを教えてもらえますか?ありがとう!

 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リダイレクトの複数のコピーを実際に持つことができることを学びました。

4

3 に答える 3

4

2つのアプローチがあります:

(1)文法を変更して、各種類の修飾子を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( "出力ファイルが多すぎます:\"%s \ "\ n"、$ 2)
    } そうしないと {
        /*出力ファイルを記録します*/
    }
}

オプション(2)は、より良いエラーメッセージとより単純な文法につながる可能性があります。

于 2009-02-23T19:04:35.880 に答える
1

3 番目のアプローチもあります。心配しないでください。Bash (Cygwin の下) は、次のエラーを生成しません。

ls > x > y

x を作成してから y を作成し、最後に y に書き込みます。

于 2009-02-27T03:54:51.743 に答える
-1

これは lexx と yacc を学習するための演習にすぎないことは承知していますが、それ以外の場合は、最初の質問は、なぜlexx と yacc を使用したいのかを尋ねることです。通常のシェル コマンド言語の文法は非常に単純です。LALRジェネレーターを使用して何を得ていますか?

複雑さ、適切なエラー メッセージの生成の難しさ、およびコードのかさばり以外には、.

于 2009-02-23T20:20:57.023 に答える