-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathpostorder.h
112 lines (102 loc) · 3.8 KB
/
postorder.h
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
#ifndef POSTORDER_H
#define POSTORDER_H
// ****************************************************************************
// postorder.h ELFE project
// ****************************************************************************
//
// File Description:
//
// Implementation of the post-order traversal algorithm on a tree.
//
//
//
//
//
//
//
//
// ****************************************************************************
// This document is released under the GNU General Public License, with the
// following clarification and exception.
//
// Linking this library statically or dynamically with other modules is making
// a combined work based on this library. Thus, the terms and conditions of the
// GNU General Public License cover the whole combination.
//
// As a special exception, the copyright holders of this library give you
// permission to link this library with independent modules to produce an
// executable, regardless of the license terms of these independent modules,
// and to copy and distribute the resulting executable under terms of your
// choice, provided that you also meet, for each linked independent module,
// the terms and conditions of the license of that module. An independent
// module is a module which is not derived from or based on this library.
// If you modify this library, you may extend this exception to your version
// of the library, but you are not obliged to do so. If you do not wish to
// do so, delete this exception statement from your version.
//
// See http://www.gnu.org/copyleft/gpl.html and Matthew 25:22 for details
// (C) 1992-2010 Christophe de Dinechin <[email protected]>
// (C) 2010 Jerome Forissier <[email protected]>
// (C) 2010 Taodyne SAS
// ****************************************************************************
#include "tree.h"
ELFE_BEGIN
template <typename Action>
struct PostOrderTraversal
// ----------------------------------------------------------------------------
// Execute action on a tree (whole or part), following the post-order algo
// ----------------------------------------------------------------------------
{
PostOrderTraversal (Action &action, bool fullScan = true):
action(action), fullScan(fullScan) {}
typedef typename Action::value_type value_type;
value_type DoInteger(Integer *what) { return what->Do(action); }
value_type DoReal(Real *what) { return what->Do(action); }
value_type DoText(Text *what) { return what->Do(action); }
value_type DoName(Name *what) { return what->Do(action); }
value_type DoBlock(Block *what)
{
// REVISIT: Why do we need to test what->child? Test fail otherwise?!?
value_type ret = value_type();
if (what->child)
ret = what->child->Do(this);
if (!fullScan && ret)
return ret;
return what->Do(action);
}
value_type DoInfix(Infix *what)
{
value_type ret = what->left->Do(this);
if (!fullScan && ret)
return ret;
ret = what->right->Do(this);
if (!fullScan && ret)
return ret;
return what->Do(action);
}
value_type DoPrefix(Prefix *what)
{
value_type ret = what->left->Do(this);
if (!fullScan && ret)
return ret;
ret = what->right->Do(this);
if (!fullScan && ret)
return ret;
return what->Do(action);
}
value_type DoPostfix(Postfix *what)
{
value_type ret;
ret = what->left->Do(this);
if (!fullScan && ret)
return ret;
ret = what->right->Do(this);
if (!fullScan && ret)
return ret;
return what->Do(action);
}
Action & action;
bool fullScan;
};
ELFE_END
#endif // POSTORDER_H