1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef STARK_TOOLS_ABSTRACT_SYNTAX_TREE_H
#define STARK_TOOLS_ABSTRACT_SYNTAX_TREE_H
#include "common/array.h"
#include "engines/stark/tools/command.h"
namespace Stark {
namespace Tools {
struct ASTCommand;
/**
* Base Abstract Syntax Tree node
*
* The abstract syntax tree directly maps the script source code.
*/
struct ASTNode {
ASTNode(ASTNode *parent);
virtual ~ASTNode();
/** Print the script source code for this node and its children */
virtual void print(uint depth, DefinitionRegistry *definitions) = 0;
/** Recursively list all the commands in the tree with the requested index */
virtual Common::Array<const ASTCommand *> listCommands(uint16 index) const = 0;
/** Find the successors of a node, either the direct follower or the condition branches */
void findSuccessors(ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const;
virtual void findSuccessorsIntern(const ASTNode *node, ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const = 0;
/** Find the first command to be executed when running this job */
virtual const ASTCommand *getFirstCommand() const = 0;
protected:
void printWithDepth(uint depth, const Common::String &string) const;
ASTNode *_parent;
};
/**
* Command AST Node
*
* Commands are leaf AST nodes. They represent an engine command call.
*/
struct ASTCommand : public ASTNode, public Command {
ASTCommand(ASTNode *parent, Command *command, DefinitionRegistry *definitions);
// ASTNode API
void print(uint depth, DefinitionRegistry *definitions) override;
Common::Array<const ASTCommand *> listCommands(uint16 index) const override;
void findSuccessorsIntern(const ASTNode *node, ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const override;
const ASTCommand *getFirstCommand() const override;
/** Build a script source code call for this command */
Common::String callString(DefinitionRegistry *definitions);
};
/**
* Block AST Node
*
* A list of consecutive script expressions.
*/
struct ASTBlock : public ASTNode {
ASTBlock(ASTNode *parent);
~ASTBlock() override;
// ASTNode API
void print(uint depth, DefinitionRegistry *definitions) override;
Common::Array<const ASTCommand *> listCommands(uint16 index) const override;
void findSuccessorsIntern(const ASTNode *node, ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const override;
const ASTCommand *getFirstCommand() const override;
/** Append a child expression to this block */
void addNode(ASTNode *node);
private:
Common::Array<ASTNode *> _children;
};
/**
* Condition AST Node
*
* An if / then / else branching condition.
*/
struct ASTCondition : public ASTNode {
ASTCondition(ASTNode *parent);
~ASTCondition() override;
// ASTNode API
void print(uint depth, DefinitionRegistry *definitions) override;
Common::Array<const ASTCommand *> listCommands(uint16 index) const override;
void findSuccessorsIntern(const ASTNode *node, ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const override;
const ASTCommand *getFirstCommand() const override;
ASTCommand *condition;
bool invertedCondition;
ASTBlock *thenBlock;
ASTBlock *elseBlock;
};
/**
* Loop AST Node
*
* A while loop.
*/
struct ASTLoop : public ASTNode {
ASTLoop(ASTNode *parent);
~ASTLoop() override;
// ASTNode API
void print(uint depth, DefinitionRegistry *definitions) override;
Common::Array<const ASTCommand *> listCommands(uint16 index) const override;
void findSuccessorsIntern(const ASTNode *node, ASTNode **follower, ASTNode **trueBranch, ASTNode **falseBranch) const override;
const ASTCommand *getFirstCommand() const override;
ASTCommand *condition;
bool invertedCondition;
ASTBlock *loopBlock;
};
} // End of namespace Tools
} // End of namespace Stark
#endif // STARK_TOOLS_ABSTRACT_SYNTAX_TREE_H
|