我正在编写解析器的代码,并具有以下接口:
class IStatement
{
// Represents instructions like "HelloWorld();"
// Or flow control blocks like : "if( foo ) { bar(); }", "return 0;" etc...
public:
virtual void execute( CScope & ) const = 0;
};以及下列课程:
class CGoto : public IStatement // Basically a sequence of IStatement sub classes.
{
protected:
vector<IStatement *>
public:
virtual void execute( CScope & ) const; // Executes all statements.
};
class CConditional : public CGoto
{
protected:
CExpression // Condition that must be true
public:
virtual void execute( CScope & ) const; // If expression is true, executes all statements (i.e call CGoto::execute()).
};我的问题是,我想创建一个类CIf:
class CIf : public CConditional // Repesents a whole if/else if/ else block.
{
// "this" is the "if" part of the if/else if/else block
vector<CConditional *> _apoElseIfs; // "else if" parts, if any.
CConditional * _poElse; // NULL if no "else" in if/else if/else block.
public:
virtual void execute( CScope & roScope ) const
{
// HERE is my problem !
// If the condition in the "if" part is true, i'm not going to execute
// the else if's or the else.
// The problem is that i have no idea from here if i should return because the
// if was executed, or if i should continue to the else if's and the else.
CConditional::execute( roScope );
// Was the condition of the "if" true ? (i.e return at this point)
// For each else if
{
current else if -> execute( roScope );
// Was the condition of the current "else if" true ? (i.e return at this point)
}
else -> execute( roScope );
}
};我不知道,在我执行了" if“或"else if”之后,我是否应该继续或返回。
我认为我可以使用布尔值作为方法execute()的返回值,该值将指示语句是否已被执行,但对于非条件的IStatement实现来说,这是没有意义的。
我也可以这样做,这样类CConditional就不会测试条件本身,并且CConditional::execute()可以不管条件如何执行语句,不管是什么操纵类本身,但是我想在CConditional::execute()方法中封装这个测试。
我希望我能尽可能清楚地解释我的问题。你知道我怎样才能干干净净的吗?
谢谢您:)
发布于 2014-02-20 16:47:54
你的设计似乎有点混乱。
我会创建一个块类,表示一个{ sttmnt1、sttmnt2、sttmntN }。
class Block : public IStatement
{
std::vector<IStatement*> statements;
public:
virtual void execute( CScope & ) const { /* executes list of statements */ }
};这样,您总是可以使用if单个语句,并且可以使用Block类来处理多个语句。
也是可以计算的语句的表达式类,如2 < x。
class IExpression : public IStatement
{
public:
virtual Value evaluate(CScope &scope) const = 0;
virtual void execute( CScope &scope ) const { evaluate(scope); }
}您需要一个Value类来表示表达式的结果。
最后,If类将一个表达式作为属性,一个语句用于if部件,另一个语句用于else部件(可选)。
class If: public IStatement
{
IExpression *condition;
IStatement *ifPart;
IStatement *elsePart;
public:
virtual void execute( CScope &scope ) const {
if (condition->evaluate().asBoolValue()) {
ifPart->execute(scope);
}
else if (elsePart) {
elsePart->execute(scope);
}
}
}要处理else if案例,只需将一个新的If对象设置为第一部分的else部分。
https://stackoverflow.com/questions/21913830
复制相似问题