質問

私はYACCおよびLEXを使用して、シェルを記述しようとしていると私は私のI / Oリダイレクタのいくつかの問題に実行していますよ。現在、私は罰金<と>演算子を使用して、任意の順序で、しかし、私の問題は、このような「LS>ログ> LOG2」

のように、私はエラーなしで二回リダイレクトすることができていることができます 誰かが私にこの問題を解決する方法についていくつかのヒントを与えることができます。

マイルールコードは、以下のでしょうか?ありがとう!

 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 */
    ;

EDIT:私のTAに話した後、私は実際に私のコマンドにのみ1修飾子を持っていると私は実際に同じI / Oリダイレクションの複数のコピーを持つことができることを必要としなかったことを学びました。

役に立ちましたか?

解決

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("too many output files: \"%s\"\n", $2)
    } else {
        /* record output file */
    }
}

オプション(2)優れたエラーメッセージとシンプルな文法につながる可能性が高いようです。

他のヒント

第三のアプローチもあります - 心配しないでください。 (Cygwinの下の)bashはエラーのために生成されません。

ls > x > y

これは、xを作成し、YおよびYへの書き込みを終了します。

私は、これはLEXXとyaccを学ぶためだけの運動であるかもしれない実現が、それ以外の最初の質問は、はLEXXとyaccを使用する理由を依頼するのですか?任意の通常のシェルコマンド言語は非常に単純な文法を持っています。あなたはLALRジェネレータを使用してから何を得ている?

さて、複雑、困難良いエラーメッセージを生成し、コードの大部分以外の、私は意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top