-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME
112 lines (86 loc) · 4.34 KB
/
README
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
README file for Programming Assignment 4 and 5
===========================================================
------------------------------------------------------------
Information about the differences between PA4 and PA5
------------------------------------------------------------
PA4:
This is Phase 1. In this phase, you will translate
a subset of COOL that only includes a single class (Main) with a single
method (Main.main) and no attributes. You will ignore most object-related
language features including case, new, dispatch, static dispatch, isvoid,
object, and strings.
PA5:
This is Phase 2, and it requires you to finish the translator to support all
the remaining features of COOL.
Conditional Compilation
-----------------------
In the primary source files, cgen.cc and cgen.h, you will see some conditional
compilation using the following directives:
#ifndef PA5 ... #endif
or
#ifdef PA5 ... #endif
These directives enclose code that is only required in Phase 1 or only
required in Phase 2, respectively. In PA4, you should not have to write
any code that is enclosed in #ifdef PA5 ... #endif.
In PA5, you should be able to ignore the former but will have to
add the latter.
The Makefile in src is set up so that you can compile phase 1 by
saying 'make cgen-1' and phase 2 by saying 'make cgen-2'. The symbol
PA5 is defined on the command line in the second case but not the
first.
------------------------------------------------------------
Common information for both PA4 and PA5
------------------------------------------------------------
cgen.cc
cgen.cc is the skeleton file for the code generator.
Code generation proceeds roughly as follows:
- The compiler driver calls program_class::cgen(ostream &os)
- program_class::cgen creates a new CgenClassTable
- CgenClassTable constructor does all code generation for the program
Code generation involves the following tasks:
- create the class tree from the class list
- perform a first setup pass on all the nodes in the tree which
includes laying out the features of the class
- create global constants
- perform a codegen pass on all the nodes in the tree
- emit code for each method in the class
- emit code for expressions using the code(CgenEnvironment *)
virtual function defined by every Expression.
- CgenEnvironment maintains global information such as the
symbol table, and must be passed from expression
to expression. A new CgenEnvironment should be created for
each method that is code-generated.
This is an approximate description of what should happen in your
compiler and the order in which it will occur. Of course, you will
need to add some of your own functions and data members to accomplish
these tasks - filling in the details is your job.
cgen.h
cgen.h is the header file for the code generator. Feel free to
add anything you need. It contains the declarations of the
class CgenClassTable and CgenNode, including what's needed to
create the tree of CgenNode's representing the class hierarchy.
cool-tree.handcode.h
cool-tree.handcode.h contains
the declarations and definitions of code generation AST nodes.
You may modify these as you wish, but be sure to do "make clean"
after doing so. Place all method definitions in cgen.cc
coolrt.c
Cool runtime implemented in C. Modify to match your generated
code (PA5 only).
coolrt.h
Cool runtime type declarations. Modify to match your generated
code (PA5 only).
from the support code cgen-phase.cc:
cgen-phase.cc supplies the driver for the compiler. You should
not modify this code.
cgen flags
The final compiled and linked code generator is called cgen.
This program will accept several command-line flags. For this
assignment, -c (code generator debug) may be useful as it sets a global
variable cgen_debug to true (1). If you want your code
generator to print debug information when the option is set,
write your debug code in the following format:
if (cgen_debug)
{
...
}