File: abstractsyntaxtree.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (146 lines) | stat: -rw-r--r-- 4,719 bytes parent folder | download | duplicates (3)
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