2

アラビア数字 (1+2) またはローマ数字 (I+II) のいずれかを合計したい場合、次のようなインタープリター パターンを使用します。

(ここから派生したコード: https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Interpreter )

struct Expression {
    virtual int interpret() = 0;
};

class ArabicNumber : public Expression {
private:
    int number;
public: 
    ArabicNumber(int number)       { this->number = number; }
    int interpret(Map variables)  { return number; }
}

class RomanNumber : public Expression {
private:
    string number;
public: 
    RomanNumber(string number)       { this->number = number; }
    int interpret(Map variables)  {
        //somehow convert the roman number string to an int
    }
}

class Plus : public Expression {
  Expression* leftOperand;
   Expression* rightOperand;
public: 
    Plus(Expression* left, Expression* right) { 
        leftOperand = left; 
        rightOperand = right;
    }
    ~Plus(){ 
        delete leftOperand;
        delete rightOperand;
    }

    int interpret(Map variables)  { 
        return leftOperand->interpret(variables) + rightOperand->interpret(variables);
    }
};

誤ったクエリ (1+II) が適切に処理されるようにするにはどうすればよいですか? 私が考えることができる唯一の解決策は、どういうわけかキャストを使用することでしたが、それはエレガントな解決策のようには思えません。それとも、パターンをそのように使用すべきではありませんか?

もちろん、このために 2 つの別個の関数を記述することも 1 つのオプションですが、このパターンをより複雑な文脈自由文法に使用したいので、1 つの関数で実行できるかどうかに興味があります。

編集:私の問題もここで説明されています。関連するセクションを引用します。

ただし、言語とそれに付随する文法を導入するには、用語のスペルミスや文法要素の配置ミスがないか、かなり広範なエラー チェックが必要です。

だから私の主な質問:その広範なエラーチェックを最適に設計するにはどうすればよいですか?

4

1 に答える 1