アラビア数字 (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 つの関数で実行できるかどうかに興味があります。
編集:私の問題もここで説明されています。関連するセクションを引用します。
ただし、言語とそれに付随する文法を導入するには、用語のスペルミスや文法要素の配置ミスがないか、かなり広範なエラー チェックが必要です。
だから私の主な質問:その広範なエラーチェックを最適に設計するにはどうすればよいですか?