4

基本的に、tokenType 構造体の << 演算子をオーバーロードする必要があります。これは次のようになります (変更できません。この方法で使用する必要があります)。

struct tokenType 
{
    int category  ;   // one of token categories defined above
    union 
    {
        int  operand ;
        char symbol ; // '+' , '-' , '*' , '/' , '^' , '='
    } ;
    int  precedence() const ;
}

オーバーロード メソッドのヘッダーは次のとおりです。

ostream & operator<< ( ostream & os , const tokenType & tk)

したがって、構造体 tk の値 (int または char) を出力する必要があります。変数がオペランドなのかシンボルなのかがわからない場合、共用体に含まれているものにアクセスするにはどうすればよいですか? ありがとう。

4

4 に答える 4

5

あなたがする必要があるのは、categoryメンバー (共用体の一部ではない) を調べて、どの共用体要素を使用するかを決定することです。次のようなものが役に立つかもしれません (明らかに、カテゴリの定義を推測しています):

switch (tk.category) {
    case catOperand:
        os << tk.operand;
        break;
    case catSymbol:
        os << tk.symbol;
        break;
}
于 2012-04-12T04:57:31.303 に答える
4

それが「カテゴリ」番号が示すべきものではないでしょうか。これは、カテゴリがタグであるタグ付きユニオンのように見えます。トークンがオペランドであるかシンボルであるかを示す必要があり、それを使用して共用体でアクセスするフィールドを決定できます。

于 2012-04-12T04:57:50.560 に答える
3

ビットは、int categoryを解釈する方法を示しますunion。通常、これは列挙型です。

いずれにせよ、switchステートメントを使用するだけです (または、カテゴリが 2 つしかない場合は、1 つでif then else十分です。

于 2012-04-12T04:59:09.040 に答える
2

演算子は (constant reference to a) を受け取り、tokenTypeメンバーcategoryは共用体のどの要素が現在有効であるかを識別するため、それを正確に出力するために必要な情報が得られます。

于 2012-04-12T04:57:22.777 に答える