Decaf Compiler
include
visitor.h
Go to the documentation of this file.
1
11
#ifndef __VISITOR_H
12
#define __VISITOR_H
13
14
#include "
ast.h
"
15
16
17
/*
18
* AST TRAVERSAL (VISITOR PATTERN)
19
*/
20
27
typedef
struct
NodeVisitor
28
{
32
void
*
data
;
33
37
Destructor
dtor
;
38
39
/*
40
* Traversal routines; each of these is called at the appropriate time as
41
* the visitor traverses the AST.
42
*/
43
44
#ifndef SKIP_IN_DOXYGEN
45
void (* previsit_default) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
46
void (*postvisit_default) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
47
void (* previsit_program) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
48
void (*postvisit_program) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
49
void (* previsit_vardecl) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
50
void (*postvisit_vardecl) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
51
void (* previsit_funcdecl) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
52
void (*postvisit_funcdecl) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
53
void (* previsit_block) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
54
void (*postvisit_block) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
55
void (* previsit_assignment) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
56
void (*postvisit_assignment) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
57
void (* previsit_conditional) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
58
void (*postvisit_conditional) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
59
void (* previsit_whileloop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
60
void (*postvisit_whileloop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
61
void (* previsit_return) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
62
void (*postvisit_return) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
63
void (* previsit_break) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
64
void (*postvisit_break) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
65
void (* previsit_continue) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
66
void (*postvisit_continue) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
67
void (* previsit_binaryop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
68
void (* invisit_binaryop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
69
void (*postvisit_binaryop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
70
void (* previsit_unaryop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
71
void (*postvisit_unaryop) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
72
void (* previsit_location) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
73
void (*postvisit_location) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
74
void (* previsit_funccall) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
75
void (*postvisit_funccall) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
76
void (* previsit_literal) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
77
void (*postvisit_literal) (
struct
NodeVisitor
* visitor,
ASTNode
* node);
78
#endif
79
80
}
NodeVisitor
;
81
87
NodeVisitor
*
NodeVisitor_new
();
88
96
void
NodeVisitor_traverse
(
NodeVisitor
* visitor,
ASTNode
* node);
97
110
void
NodeVisitor_traverse_and_free
(
NodeVisitor
* visitor,
ASTNode
* node);
111
117
void
NodeVisitor_free
(
NodeVisitor
* visitor);
118
119
120
/*
121
* VISITORS
122
*/
123
130
NodeVisitor
*
PrintVisitor_new
(FILE* output);
131
144
NodeVisitor
*
GenerateASTGraph_new
(FILE* output);
145
153
NodeVisitor
*
SetParentVisitor_new
();
154
162
NodeVisitor
*
CalcDepthVisitor_new
();
163
164
#endif
NodeVisitor_traverse
void NodeVisitor_traverse(NodeVisitor *visitor, ASTNode *node)
Perform an AST traversal using the given visitor.
Definition:
visitor.c:60
ASTNode
Main AST node structure.
Definition:
ast.h:449
SetParentVisitor_new
NodeVisitor * SetParentVisitor_new()
Create a new visitor that sets up parent pointers as attributes.
Definition:
visitor.c:550
CalcDepthVisitor_new
NodeVisitor * CalcDepthVisitor_new()
Create a new visitor that calculates node depths as attributes.
Definition:
visitor.c:584
PrintVisitor_new
NodeVisitor * PrintVisitor_new(FILE *output)
Create a new AST debug print visitor.
Definition:
visitor.c:329
ast.h
AST nodes and attributes.
NodeVisitor
Node visitor structure.
Definition:
visitor.h:27
NodeVisitor_free
void NodeVisitor_free(NodeVisitor *visitor)
Deallocate a visitor structure.
Definition:
visitor.c:188
NodeVisitor::data
void * data
Visitor-specific state information.
Definition:
visitor.h:32
NodeVisitor
struct NodeVisitor NodeVisitor
Node visitor structure.
NodeVisitor_traverse_and_free
void NodeVisitor_traverse_and_free(NodeVisitor *visitor, ASTNode *node)
Perform an AST traversal using the given visitor and then deallocate the visitor.
Definition:
visitor.c:182
GenerateASTGraph_new
NodeVisitor * GenerateASTGraph_new(FILE *output)
Create a new AST debug graph output visitor.
Definition:
visitor.c:455
NodeVisitor::dtor
Destructor dtor
Pointer to destructor function (used to deallocate the data member)
Definition:
visitor.h:37
NodeVisitor_new
NodeVisitor * NodeVisitor_new()
Allocate a new generic visitor structure.
Definition:
visitor.c:13
Destructor
void(* Destructor)(void *)
Function pointer used to store references to custom "free" routines.
Definition:
ast.h:23
Generated by
1.8.16