Browse Source

completeddd

Matt Coles 8 years ago
parent
commit
f8a1a32544
18 changed files with 1389 additions and 1356 deletions
  1. BIN
      .DS_Store
  2. 10 0
      report/report.aux
  3. 77 0
      report/report.log
  4. BIN
      report/report.pdf
  5. 34 0
      report/report.tex
  6. 9 0
      report/report.toc
  7. 1027 978
      tac/C.tab.c
  8. 61 47
      tac/C.tab.h
  9. 124 138
      tac/lex.yy.c
  10. 31 10
      tac/main.c
  11. 0 122
      tac/recursion.asm
  12. 8 2
      tac/tests/Makefile
  13. 2 4
      tac/tests/all_scopes.c
  14. 2 5
      tac/tests/cplus.c
  15. 0 14
      tac/tests/deep_closure.c
  16. 0 11
      tac/tests/immed_call.c
  17. 0 20
      tac/tests/really_deep_closure.c
  18. 4 5
      tac/tests/twice.c

BIN
.DS_Store


+ 10 - 0
report/report.aux

@@ -0,0 +1,10 @@
1
+\relax 
2
+\@writefile{toc}{\contentsline {section}{\numberline {1}Overview}{I}}
3
+\@writefile{toc}{\contentsline {section}{\numberline {2}Implementation}{I}}
4
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Interpreter}{I}}
5
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Three-Address-Code Translation}{I}}
6
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}MIPS Translation}{I}}
7
+\@writefile{toc}{\contentsline {section}{\numberline {3}Three-Address-Code Specification}{I}}
8
+\@writefile{toc}{\contentsline {section}{\numberline {4}Example Test Cases}{I}}
9
+\@writefile{toc}{\contentsline {section}{\numberline {5}Critical Analysis}{I}}
10
+\@writefile{toc}{\contentsline {section}{\numberline {6}Further Improvements}{I}}

+ 77 - 0
report/report.log

@@ -0,0 +1,77 @@
1
+This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex 2017.11.24)  7 DEC 2017 11:48
2
+entering extended mode
3
+ restricted \write18 enabled.
4
+ %&-line parsing enabled.
5
+**\nonstopmode \input{report.tex}
6
+(./report.tex (/usr/local/texlive/2017/texmf-dist/tex/latex/base/article.cls
7
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
8
+(/usr/local/texlive/2017/texmf-dist/tex/latex/base/size10.clo
9
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
10
+)
11
+\c@part=\count79
12
+\c@section=\count80
13
+\c@subsection=\count81
14
+\c@subsubsection=\count82
15
+\c@paragraph=\count83
16
+\c@subparagraph=\count84
17
+\c@figure=\count85
18
+\c@table=\count86
19
+\abovecaptionskip=\skip41
20
+\belowcaptionskip=\skip42
21
+\bibindent=\dimen102
22
+) (./report.aux)
23
+\openout1 = `report.aux'.
24
+
25
+LaTeX Font Info:    Checking defaults for OML/cmm/m/it on input line 9.
26
+LaTeX Font Info:    ... okay on input line 9.
27
+LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 9.
28
+LaTeX Font Info:    ... okay on input line 9.
29
+LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 9.
30
+LaTeX Font Info:    ... okay on input line 9.
31
+LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 9.
32
+LaTeX Font Info:    ... okay on input line 9.
33
+LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 9.
34
+LaTeX Font Info:    ... okay on input line 9.
35
+LaTeX Font Info:    Checking defaults for U/cmr/m/n on input line 9.
36
+LaTeX Font Info:    ... okay on input line 9.
37
+LaTeX Font Info:    External font `cmex10' loaded for size
38
+(Font)              <12> on input line 11.
39
+LaTeX Font Info:    External font `cmex10' loaded for size
40
+(Font)              <8> on input line 11.
41
+LaTeX Font Info:    External font `cmex10' loaded for size
42
+(Font)              <6> on input line 11.
43
+
44
+(./report.toc
45
+LaTeX Font Info:    External font `cmex10' loaded for size
46
+(Font)              <7> on input line 3.
47
+LaTeX Font Info:    External font `cmex10' loaded for size
48
+(Font)              <5> on input line 3.
49
+)
50
+\tf@toc=\write3
51
+\openout3 = `report.toc'.
52
+
53
+ [1
54
+
55
+{/usr/local/texlive/2017/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [1] (./
56
+report.aux) ) 
57
+Here is how much of TeX's memory you used:
58
+ 235 strings out of 492995
59
+ 2524 string characters out of 6132703
60
+ 56074 words of memory out of 5000000
61
+ 3860 multiletter control sequences out of 15000+600000
62
+ 7895 words of font info for 28 fonts, out of 8000000 for 9000
63
+ 1141 hyphenation exceptions out of 8191
64
+ 24i,6n,18p,152b,185s stack positions out of 5000i,500n,10000p,200000b,80000s
65
+</usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm
66
+/cmbx10.pfb></usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm/
67
+cmbx12.pfb></usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm/c
68
+mr10.pfb></usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm/cmr
69
+12.pfb></usr/local/texlive/2017/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17
70
+.pfb>
71
+Output written on report.pdf (2 pages, 65227 bytes).
72
+PDF statistics:
73
+ 31 PDF objects out of 1000 (max. 8388607)
74
+ 21 compressed objects within 1 object stream
75
+ 0 named destinations out of 1000 (max. 500000)
76
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
77
+

BIN
report/report.pdf


+ 34 - 0
report/report.tex

@@ -0,0 +1,34 @@
1
+\documentclass{article}
2
+
3
+\setlength{\parskip}{6pt}
4
+\setlength{\parindent}{0pt}
5
+
6
+\title{Compiler Report}
7
+\author{Matt Coles - mc930}
8
+
9
+\begin{document}
10
+\pagenumbering{gobble}
11
+\maketitle
12
+\tableofcontents
13
+\newpage
14
+\pagenumbering{Roman}
15
+
16
+\section{Overview}
17
+
18
+\section{Implementation}
19
+\subsection{Interpreter}
20
+The interpreter was created
21
+
22
+\subsection{Three-Address-Code Translation}
23
+
24
+\subsection{MIPS Translation}
25
+
26
+\section{Three-Address-Code Specification}
27
+
28
+\section{Example Test Cases}
29
+
30
+\section{Critical Analysis}
31
+
32
+\section{Further Improvements}
33
+
34
+\end{document}

+ 9 - 0
report/report.toc

@@ -0,0 +1,9 @@
1
+\contentsline {section}{\numberline {1}Overview}{I}
2
+\contentsline {section}{\numberline {2}Implementation}{I}
3
+\contentsline {subsection}{\numberline {2.1}Interpreter}{I}
4
+\contentsline {subsection}{\numberline {2.2}Three-Address-Code Translation}{I}
5
+\contentsline {subsection}{\numberline {2.3}MIPS Translation}{I}
6
+\contentsline {section}{\numberline {3}Three-Address-Code Specification}{I}
7
+\contentsline {section}{\numberline {4}Example Test Cases}{I}
8
+\contentsline {section}{\numberline {5}Critical Analysis}{I}
9
+\contentsline {section}{\numberline {6}Further Improvements}{I}

File diff suppressed because it is too large
+ 1027 - 978
tac/C.tab.c


+ 61 - 47
tac/C.tab.h

@@ -1,13 +1,14 @@
1
-/* A Bison parser, made by GNU Bison 3.0.4.  */
1
+/* A Bison parser, made by GNU Bison 2.3.  */
2 2
 
3
-/* Bison interface for Yacc-like parsers in C
3
+/* Skeleton interface for Bison's Yacc-like parsers in C
4 4
 
5
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
5
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6
+   Free Software Foundation, Inc.
6 7
 
7
-   This program is free software: you can redistribute it and/or modify
8
+   This program is free software; you can redistribute it and/or modify
8 9
    it under the terms of the GNU General Public License as published by
9
-   the Free Software Foundation, either version 3 of the License, or
10
-   (at your option) any later version.
10
+   the Free Software Foundation; either version 2, or (at your option)
11
+   any later version.
11 12
 
12 13
    This program is distributed in the hope that it will be useful,
13 14
    but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,7 +16,9 @@
15 16
    GNU General Public License for more details.
16 17
 
17 18
    You should have received a copy of the GNU General Public License
18
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
+   along with this program; if not, write to the Free Software
20
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
21
+   Boston, MA 02110-1301, USA.  */
19 22
 
20 23
 /* As a special exception, you may create a larger work that contains
21 24
    part or all of the Bison parser skeleton and distribute that work
@@ -30,54 +33,65 @@
30 33
    This special exception was added by the Free Software Foundation in
31 34
    version 2.2 of Bison.  */
32 35
 
33
-#ifndef YY_YY_C_TAB_H_INCLUDED
34
-# define YY_YY_C_TAB_H_INCLUDED
35
-/* Debug traces.  */
36
-#ifndef YYDEBUG
37
-# define YYDEBUG 1
38
-#endif
39
-#if YYDEBUG
40
-extern int yydebug;
41
-#endif
42
-
43
-/* Token type.  */
36
+/* Tokens.  */
44 37
 #ifndef YYTOKENTYPE
45 38
 # define YYTOKENTYPE
46
-  enum yytokentype
47
-  {
48
-    IDENTIFIER = 258,
49
-    CONSTANT = 259,
50
-    STRING_LITERAL = 260,
51
-    LE_OP = 261,
52
-    GE_OP = 262,
53
-    EQ_OP = 263,
54
-    NE_OP = 264,
55
-    EXTERN = 265,
56
-    AUTO = 266,
57
-    INT = 267,
58
-    VOID = 268,
59
-    FUNCTION = 269,
60
-    APPLY = 270,
61
-    LEAF = 271,
62
-    IF = 272,
63
-    ELSE = 273,
64
-    WHILE = 274,
65
-    CONTINUE = 275,
66
-    BREAK = 276,
67
-    RETURN = 277
68
-  };
39
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
40
+      know about them.  */
41
+   enum yytokentype {
42
+     IDENTIFIER = 258,
43
+     CONSTANT = 259,
44
+     STRING_LITERAL = 260,
45
+     LE_OP = 261,
46
+     GE_OP = 262,
47
+     EQ_OP = 263,
48
+     NE_OP = 264,
49
+     EXTERN = 265,
50
+     AUTO = 266,
51
+     INT = 267,
52
+     VOID = 268,
53
+     FUNCTION = 269,
54
+     APPLY = 270,
55
+     LEAF = 271,
56
+     IF = 272,
57
+     ELSE = 273,
58
+     WHILE = 274,
59
+     CONTINUE = 275,
60
+     BREAK = 276,
61
+     RETURN = 277
62
+   };
69 63
 #endif
64
+/* Tokens.  */
65
+#define IDENTIFIER 258
66
+#define CONSTANT 259
67
+#define STRING_LITERAL 260
68
+#define LE_OP 261
69
+#define GE_OP 262
70
+#define EQ_OP 263
71
+#define NE_OP 264
72
+#define EXTERN 265
73
+#define AUTO 266
74
+#define INT 267
75
+#define VOID 268
76
+#define FUNCTION 269
77
+#define APPLY 270
78
+#define LEAF 271
79
+#define IF 272
80
+#define ELSE 273
81
+#define WHILE 274
82
+#define CONTINUE 275
83
+#define BREAK 276
84
+#define RETURN 277
85
+
86
+
87
+
70 88
 
71
-/* Value type.  */
72 89
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
73 90
 typedef int YYSTYPE;
74
-# define YYSTYPE_IS_TRIVIAL 1
91
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
75 92
 # define YYSTYPE_IS_DECLARED 1
93
+# define YYSTYPE_IS_TRIVIAL 1
76 94
 #endif
77 95
 
78
-
79 96
 extern YYSTYPE yylval;
80 97
 
81
-int yyparse (void);
82
-
83
-#endif /* !YY_YY_C_TAB_H_INCLUDED  */

+ 124 - 138
tac/lex.yy.c

@@ -7,8 +7,8 @@
7 7
 
8 8
 #define FLEX_SCANNER
9 9
 #define YY_FLEX_MAJOR_VERSION 2
10
-#define YY_FLEX_MINOR_VERSION 6
11
-#define YY_FLEX_SUBMINOR_VERSION 1
10
+#define YY_FLEX_MINOR_VERSION 5
11
+#define YY_FLEX_SUBMINOR_VERSION 35
12 12
 #if YY_FLEX_SUBMINOR_VERSION > 0
13 13
 #define FLEX_BETA
14 14
 #endif
@@ -46,6 +46,7 @@ typedef int16_t flex_int16_t;
46 46
 typedef uint16_t flex_uint16_t;
47 47
 typedef int32_t flex_int32_t;
48 48
 typedef uint32_t flex_uint32_t;
49
+typedef uint64_t flex_uint64_t;
49 50
 #else
50 51
 typedef signed char flex_int8_t;
51 52
 typedef short int flex_int16_t;
@@ -53,6 +54,7 @@ typedef int flex_int32_t;
53 54
 typedef unsigned char flex_uint8_t; 
54 55
 typedef unsigned short int flex_uint16_t;
55 56
 typedef unsigned int flex_uint32_t;
57
+#endif /* ! C99 */
56 58
 
57 59
 /* Limits of integral types. */
58 60
 #ifndef INT8_MIN
@@ -83,17 +85,27 @@ typedef unsigned int flex_uint32_t;
83 85
 #define UINT32_MAX             (4294967295U)
84 86
 #endif
85 87
 
86
-#endif /* ! C99 */
87
-
88 88
 #endif /* ! FLEXINT_H */
89 89
 
90
-/* TODO: this is always defined, so inline it */
91
-#define yyconst const
90
+#ifdef __cplusplus
91
+
92
+/* The "const" storage-class-modifier is valid. */
93
+#define YY_USE_CONST
94
+
95
+#else	/* ! __cplusplus */
96
+
97
+/* C99 requires __STDC__ to be defined as 1. */
98
+#if defined (__STDC__)
99
+
100
+#define YY_USE_CONST
101
+
102
+#endif	/* defined (__STDC__) */
103
+#endif	/* ! __cplusplus */
92 104
 
93
-#if defined(__GNUC__) && __GNUC__ >= 3
94
-#define yynoreturn __attribute__((__noreturn__))
105
+#ifdef YY_USE_CONST
106
+#define yyconst const
95 107
 #else
96
-#define yynoreturn
108
+#define yyconst
97 109
 #endif
98 110
 
99 111
 /* Returned upon end-of-file. */
@@ -129,15 +141,7 @@ typedef unsigned int flex_uint32_t;
129 141
 
130 142
 /* Size of default input buffer. */
131 143
 #ifndef YY_BUF_SIZE
132
-#ifdef __ia64__
133
-/* On IA-64, the buffer size is 16k, not 8k.
134
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
135
- * Ditto for the __ia64__ case accordingly.
136
- */
137
-#define YY_BUF_SIZE 32768
138
-#else
139 144
 #define YY_BUF_SIZE 16384
140
-#endif /* __ia64__ */
141 145
 #endif
142 146
 
143 147
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -154,7 +158,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
154 158
 typedef size_t yy_size_t;
155 159
 #endif
156 160
 
157
-extern int yyleng;
161
+extern yy_size_t yyleng;
158 162
 
159 163
 extern FILE *yyin, *yyout;
160 164
 
@@ -163,7 +167,6 @@ extern FILE *yyin, *yyout;
163 167
 #define EOB_ACT_LAST_MATCH 2
164 168
 
165 169
     #define YY_LESS_LINENO(n)
166
-    #define YY_LINENO_REWIND_TO(ptr)
167 170
     
168 171
 /* Return all but the first "n" matched characters back to the input stream. */
169 172
 #define yyless(n) \
@@ -193,12 +196,12 @@ struct yy_buffer_state
193 196
 	/* Size of input buffer in bytes, not including room for EOB
194 197
 	 * characters.
195 198
 	 */
196
-	int yy_buf_size;
199
+	yy_size_t yy_buf_size;
197 200
 
198 201
 	/* Number of characters read into yy_ch_buf, not including EOB
199 202
 	 * characters.
200 203
 	 */
201
-	int yy_n_chars;
204
+	yy_size_t yy_n_chars;
202 205
 
203 206
 	/* Whether we "own" the buffer - i.e., we know we created it,
204 207
 	 * and can realloc() it to grow it, and should free() it to
@@ -221,7 +224,7 @@ struct yy_buffer_state
221 224
 
222 225
     int yy_bs_lineno; /**< The line count. */
223 226
     int yy_bs_column; /**< The column count. */
224
-
227
+    
225 228
 	/* Whether to try to fill the input buffer when we reach the
226 229
 	 * end of it.
227 230
 	 */
@@ -249,7 +252,7 @@ struct yy_buffer_state
249 252
 /* Stack of input buffers. */
250 253
 static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
251 254
 static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
252
-static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
255
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
253 256
 
254 257
 /* We provide macros for accessing buffer states in case in the
255 258
  * future we want to put the buffer states in a more general
@@ -268,11 +271,11 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
268 271
 
269 272
 /* yy_hold_char holds the character lost when yytext is formed. */
270 273
 static char yy_hold_char;
271
-static int yy_n_chars;		/* number of characters read into yy_ch_buf */
272
-int yyleng;
274
+static yy_size_t yy_n_chars;		/* number of characters read into yy_ch_buf */
275
+yy_size_t yyleng;
273 276
 
274 277
 /* Points to current character in buffer. */
275
-static char *yy_c_buf_p = NULL;
278
+static char *yy_c_buf_p = (char *) 0;
276 279
 static int yy_init = 0;		/* whether we need to initialize */
277 280
 static int yy_start = 0;	/* start state number */
278 281
 
@@ -297,7 +300,7 @@ static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
297 300
 
298 301
 YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
299 302
 YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
300
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
303
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len  );
301 304
 
302 305
 void *yyalloc (yy_size_t  );
303 306
 void *yyrealloc (void *,yy_size_t  );
@@ -331,7 +334,7 @@ void yyfree (void *  );
331 334
 
332 335
 typedef unsigned char YY_CHAR;
333 336
 
334
-FILE *yyin = NULL, *yyout = NULL;
337
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
335 338
 
336 339
 typedef int yy_state_type;
337 340
 
@@ -340,22 +343,19 @@ extern int yylineno;
340 343
 int yylineno = 1;
341 344
 
342 345
 extern char *yytext;
343
-#ifdef yytext_ptr
344
-#undef yytext_ptr
345
-#endif
346 346
 #define yytext_ptr yytext
347 347
 
348 348
 static yy_state_type yy_get_previous_state (void );
349 349
 static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
350 350
 static int yy_get_next_buffer (void );
351
-static void yynoreturn yy_fatal_error (yyconst char* msg  );
351
+static void yy_fatal_error (yyconst char msg[]  );
352 352
 
353 353
 /* Done after the current pattern has been matched and before the
354 354
  * corresponding action - sets up yytext.
355 355
  */
356 356
 #define YY_DO_BEFORE_ACTION \
357 357
 	(yytext_ptr) = yy_bp; \
358
-	yyleng = (int) (yy_cp - yy_bp); \
358
+	yyleng = (yy_size_t) (yy_cp - yy_bp); \
359 359
 	(yy_hold_char) = *yy_cp; \
360 360
 	*yy_cp = '\0'; \
361 361
 	(yy_c_buf_p) = yy_cp;
@@ -384,7 +384,7 @@ static yyconst flex_int16_t yy_accept[98] =
384 384
 
385 385
     } ;
386 386
 
387
-static yyconst YY_CHAR yy_ec[256] =
387
+static yyconst flex_int32_t yy_ec[256] =
388 388
     {   0,
389 389
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
390 390
         2,    2,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -416,7 +416,7 @@ static yyconst YY_CHAR yy_ec[256] =
416 416
         1,    1,    1,    1,    1
417 417
     } ;
418 418
 
419
-static yyconst YY_CHAR yy_meta[46] =
419
+static yyconst flex_int32_t yy_meta[46] =
420 420
     {   0,
421 421
         1,    1,    1,    1,    1,    1,    2,    1,    1,    1,
422 422
         1,    1,    1,    1,    3,    1,    1,    1,    1,    1,
@@ -425,7 +425,7 @@ static yyconst YY_CHAR yy_meta[46] =
425 425
         3,    3,    3,    1,    1
426 426
     } ;
427 427
 
428
-static yyconst flex_uint16_t yy_base[101] =
428
+static yyconst flex_int16_t yy_base[101] =
429 429
     {   0,
430 430
         0,    0,  130,  131,  131,  131,  110,   41,  131,  104,
431 431
       131,  131,  131,  131,  131,  131,  117,   32,  131,  131,
@@ -455,7 +455,7 @@ static yyconst flex_int16_t yy_def[101] =
455 455
 
456 456
     } ;
457 457
 
458
-static yyconst flex_uint16_t yy_nxt[177] =
458
+static yyconst flex_int16_t yy_nxt[177] =
459 459
     {   0,
460 460
         4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
461 461
        14,   15,   16,   17,   18,   19,   20,   21,   22,   23,
@@ -567,19 +567,19 @@ void yyset_extra (YY_EXTRA_TYPE user_defined  );
567 567
 
568 568
 FILE *yyget_in (void );
569 569
 
570
-void yyset_in  (FILE * _in_str  );
570
+void yyset_in  (FILE * in_str  );
571 571
 
572 572
 FILE *yyget_out (void );
573 573
 
574
-void yyset_out  (FILE * _out_str  );
574
+void yyset_out  (FILE * out_str  );
575 575
 
576
-			int yyget_leng (void );
576
+yy_size_t yyget_leng (void );
577 577
 
578 578
 char *yyget_text (void );
579 579
 
580 580
 int yyget_lineno (void );
581 581
 
582
-void yyset_lineno (int _line_number  );
582
+void yyset_lineno (int line_number  );
583 583
 
584 584
 /* Macros after this point can all be overridden by user definitions in
585 585
  * section 1.
@@ -593,12 +593,8 @@ extern int yywrap (void );
593 593
 #endif
594 594
 #endif
595 595
 
596
-#ifndef YY_NO_UNPUT
597
-    
598 596
     static void yyunput (int c,char *buf_ptr  );
599 597
     
600
-#endif
601
-
602 598
 #ifndef yytext_ptr
603 599
 static void yy_flex_strncpy (char *,yyconst char *,int );
604 600
 #endif
@@ -619,12 +615,7 @@ static int input (void );
619 615
 
620 616
 /* Amount of stuff to slurp up with each read. */
621 617
 #ifndef YY_READ_BUF_SIZE
622
-#ifdef __ia64__
623
-/* On IA-64, the buffer size is 16k, not 8k */
624
-#define YY_READ_BUF_SIZE 16384
625
-#else
626 618
 #define YY_READ_BUF_SIZE 8192
627
-#endif /* __ia64__ */
628 619
 #endif
629 620
 
630 621
 /* Copy whatever the last rule matched to the standard output. */
@@ -632,7 +623,7 @@ static int input (void );
632 623
 /* This used to be an fputs(), but since the string might contain NUL's,
633 624
  * we now use fwrite().
634 625
  */
635
-#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
626
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
636 627
 #endif
637 628
 
638 629
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -643,7 +634,7 @@ static int input (void );
643 634
 	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
644 635
 		{ \
645 636
 		int c = '*'; \
646
-		size_t n; \
637
+		yy_size_t n; \
647 638
 		for ( n = 0; n < max_size && \
648 639
 			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
649 640
 			buf[n] = (char) c; \
@@ -656,7 +647,7 @@ static int input (void );
656 647
 	else \
657 648
 		{ \
658 649
 		errno=0; \
659
-		while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
650
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
660 651
 			{ \
661 652
 			if( errno != EINTR) \
662 653
 				{ \
@@ -711,7 +702,7 @@ extern int yylex (void);
711 702
 
712 703
 /* Code executed at the end of each rule. */
713 704
 #ifndef YY_BREAK
714
-#define YY_BREAK /*LINTED*/break;
705
+#define YY_BREAK break;
715 706
 #endif
716 707
 
717 708
 #define YY_RULE_SETUP \
@@ -721,10 +712,14 @@ extern int yylex (void);
721 712
  */
722 713
 YY_DECL
723 714
 {
724
-	yy_state_type yy_current_state;
725
-	char *yy_cp, *yy_bp;
726
-	int yy_act;
715
+	register yy_state_type yy_current_state;
716
+	register char *yy_cp, *yy_bp;
717
+	register int yy_act;
727 718
     
719
+#line 28 "C.flex"
720
+
721
+#line 722 "lex.yy.c"
722
+
728 723
 	if ( !(yy_init) )
729 724
 		{
730 725
 		(yy_init) = 1;
@@ -751,12 +746,7 @@ YY_DECL
751 746
 		yy_load_buffer_state( );
752 747
 		}
753 748
 
754
-	{
755
-#line 28 "C.flex"
756
-
757
-#line 758 "lex.yy.c"
758
-
759
-	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
749
+	while ( 1 )		/* loops until end-of-file is reached */
760 750
 		{
761 751
 		yy_cp = (yy_c_buf_p);
762 752
 
@@ -772,7 +762,7 @@ YY_DECL
772 762
 yy_match:
773 763
 		do
774 764
 			{
775
-			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
765
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
776 766
 			if ( yy_accept[yy_current_state] )
777 767
 				{
778 768
 				(yy_last_accepting_state) = yy_current_state;
@@ -784,7 +774,7 @@ yy_match:
784 774
 				if ( yy_current_state >= 98 )
785 775
 					yy_c = yy_meta[(unsigned int) yy_c];
786 776
 				}
787
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
777
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
788 778
 			++yy_cp;
789 779
 			}
790 780
 		while ( yy_base[yy_current_state] != 131 );
@@ -1011,7 +1001,7 @@ YY_RULE_SETUP
1011 1001
 #line 76 "C.flex"
1012 1002
 ECHO;
1013 1003
 	YY_BREAK
1014
-#line 1015 "lex.yy.c"
1004
+#line 1005 "lex.yy.c"
1015 1005
 case YY_STATE_EOF(INITIAL):
1016 1006
 	yyterminate();
1017 1007
 
@@ -1142,7 +1132,6 @@ case YY_STATE_EOF(INITIAL):
1142 1132
 			"fatal flex scanner internal error--no action found" );
1143 1133
 	} /* end of action switch */
1144 1134
 		} /* end of scanning one token */
1145
-	} /* end of user's declarations */
1146 1135
 } /* end of yylex */
1147 1136
 
1148 1137
 /* yy_get_next_buffer - try to read in a new buffer
@@ -1154,9 +1143,9 @@ case YY_STATE_EOF(INITIAL):
1154 1143
  */
1155 1144
 static int yy_get_next_buffer (void)
1156 1145
 {
1157
-    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
1158
-	char *source = (yytext_ptr);
1159
-	int number_to_move, i;
1146
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
1147
+	register char *source = (yytext_ptr);
1148
+	register int number_to_move, i;
1160 1149
 	int ret_val;
1161 1150
 
1162 1151
 	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
@@ -1185,7 +1174,7 @@ static int yy_get_next_buffer (void)
1185 1174
 	/* Try to read more data. */
1186 1175
 
1187 1176
 	/* First move last chars to start of buffer. */
1188
-	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
1177
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
1189 1178
 
1190 1179
 	for ( i = 0; i < number_to_move; ++i )
1191 1180
 		*(dest++) = *(source++);
@@ -1198,21 +1187,21 @@ static int yy_get_next_buffer (void)
1198 1187
 
1199 1188
 	else
1200 1189
 		{
1201
-			int num_to_read =
1190
+			yy_size_t num_to_read =
1202 1191
 			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
1203 1192
 
1204 1193
 		while ( num_to_read <= 0 )
1205 1194
 			{ /* Not enough room in the buffer - grow it. */
1206 1195
 
1207 1196
 			/* just a shorter name for the current buffer */
1208
-			YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
1197
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
1209 1198
 
1210 1199
 			int yy_c_buf_p_offset =
1211 1200
 				(int) ((yy_c_buf_p) - b->yy_ch_buf);
1212 1201
 
1213 1202
 			if ( b->yy_is_our_buffer )
1214 1203
 				{
1215
-				int new_size = b->yy_buf_size * 2;
1204
+				yy_size_t new_size = b->yy_buf_size * 2;
1216 1205
 
1217 1206
 				if ( new_size <= 0 )
1218 1207
 					b->yy_buf_size += b->yy_buf_size / 8;
@@ -1225,7 +1214,7 @@ static int yy_get_next_buffer (void)
1225 1214
 				}
1226 1215
 			else
1227 1216
 				/* Can't grow it, we don't own it. */
1228
-				b->yy_ch_buf = NULL;
1217
+				b->yy_ch_buf = 0;
1229 1218
 
1230 1219
 			if ( ! b->yy_ch_buf )
1231 1220
 				YY_FATAL_ERROR(
@@ -1267,9 +1256,9 @@ static int yy_get_next_buffer (void)
1267 1256
 	else
1268 1257
 		ret_val = EOB_ACT_CONTINUE_SCAN;
1269 1258
 
1270
-	if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
1259
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
1271 1260
 		/* Extend the array by 50%, plus the number we really need. */
1272
-		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
1261
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
1273 1262
 		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
1274 1263
 		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
1275 1264
 			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
@@ -1288,14 +1277,14 @@ static int yy_get_next_buffer (void)
1288 1277
 
1289 1278
     static yy_state_type yy_get_previous_state (void)
1290 1279
 {
1291
-	yy_state_type yy_current_state;
1292
-	char *yy_cp;
1280
+	register yy_state_type yy_current_state;
1281
+	register char *yy_cp;
1293 1282
     
1294 1283
 	yy_current_state = (yy_start);
1295 1284
 
1296 1285
 	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
1297 1286
 		{
1298
-		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
1287
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
1299 1288
 		if ( yy_accept[yy_current_state] )
1300 1289
 			{
1301 1290
 			(yy_last_accepting_state) = yy_current_state;
@@ -1307,7 +1296,7 @@ static int yy_get_next_buffer (void)
1307 1296
 			if ( yy_current_state >= 98 )
1308 1297
 				yy_c = yy_meta[(unsigned int) yy_c];
1309 1298
 			}
1310
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
1299
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
1311 1300
 		}
1312 1301
 
1313 1302
 	return yy_current_state;
@@ -1320,10 +1309,10 @@ static int yy_get_next_buffer (void)
1320 1309
  */
1321 1310
     static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
1322 1311
 {
1323
-	int yy_is_jam;
1324
-    	char *yy_cp = (yy_c_buf_p);
1312
+	register int yy_is_jam;
1313
+    	register char *yy_cp = (yy_c_buf_p);
1325 1314
 
1326
-	YY_CHAR yy_c = 1;
1315
+	register YY_CHAR yy_c = 1;
1327 1316
 	if ( yy_accept[yy_current_state] )
1328 1317
 		{
1329 1318
 		(yy_last_accepting_state) = yy_current_state;
@@ -1335,17 +1324,15 @@ static int yy_get_next_buffer (void)
1335 1324
 		if ( yy_current_state >= 98 )
1336 1325
 			yy_c = yy_meta[(unsigned int) yy_c];
1337 1326
 		}
1338
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
1327
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
1339 1328
 	yy_is_jam = (yy_current_state == 97);
1340 1329
 
1341
-		return yy_is_jam ? 0 : yy_current_state;
1330
+	return yy_is_jam ? 0 : yy_current_state;
1342 1331
 }
1343 1332
 
1344
-#ifndef YY_NO_UNPUT
1345
-
1346
-    static void yyunput (int c, char * yy_bp )
1333
+    static void yyunput (int c, register char * yy_bp )
1347 1334
 {
1348
-	char *yy_cp;
1335
+	register char *yy_cp;
1349 1336
     
1350 1337
     yy_cp = (yy_c_buf_p);
1351 1338
 
@@ -1355,10 +1342,10 @@ static int yy_get_next_buffer (void)
1355 1342
 	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
1356 1343
 		{ /* need to shift things up to make room */
1357 1344
 		/* +2 for EOB chars. */
1358
-		int number_to_move = (yy_n_chars) + 2;
1359
-		char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
1345
+		register yy_size_t number_to_move = (yy_n_chars) + 2;
1346
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
1360 1347
 					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
1361
-		char *source =
1348
+		register char *source =
1362 1349
 				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
1363 1350
 
1364 1351
 		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
@@ -1367,7 +1354,7 @@ static int yy_get_next_buffer (void)
1367 1354
 		yy_cp += (int) (dest - source);
1368 1355
 		yy_bp += (int) (dest - source);
1369 1356
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
1370
-			(yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
1357
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
1371 1358
 
1372 1359
 		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
1373 1360
 			YY_FATAL_ERROR( "flex scanner push-back overflow" );
@@ -1380,8 +1367,6 @@ static int yy_get_next_buffer (void)
1380 1367
 	(yy_c_buf_p) = yy_cp;
1381 1368
 }
1382 1369
 
1383
-#endif
1384
-
1385 1370
 #ifndef YY_NO_INPUT
1386 1371
 #ifdef __cplusplus
1387 1372
     static int yyinput (void)
@@ -1406,7 +1391,7 @@ static int yy_get_next_buffer (void)
1406 1391
 
1407 1392
 		else
1408 1393
 			{ /* need more input */
1409
-			int offset = (yy_c_buf_p) - (yytext_ptr);
1394
+			yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
1410 1395
 			++(yy_c_buf_p);
1411 1396
 
1412 1397
 			switch ( yy_get_next_buffer(  ) )
@@ -1531,7 +1516,7 @@ static void yy_load_buffer_state  (void)
1531 1516
 	if ( ! b )
1532 1517
 		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
1533 1518
 
1534
-	b->yy_buf_size = (yy_size_t)size;
1519
+	b->yy_buf_size = size;
1535 1520
 
1536 1521
 	/* yy_ch_buf has to be 2 characters longer than the size given because
1537 1522
 	 * we need to put in 2 end-of-buffer characters.
@@ -1566,6 +1551,10 @@ static void yy_load_buffer_state  (void)
1566 1551
 	yyfree((void *) b  );
1567 1552
 }
1568 1553
 
1554
+#ifndef __cplusplus
1555
+extern int isatty (int );
1556
+#endif /* __cplusplus */
1557
+    
1569 1558
 /* Initializes or reinitializes a buffer.
1570 1559
  * This function is sometimes called more than once on the same buffer,
1571 1560
  * such as during a yyrestart() or at EOF.
@@ -1678,7 +1667,7 @@ void yypop_buffer_state (void)
1678 1667
  */
1679 1668
 static void yyensure_buffer_stack (void)
1680 1669
 {
1681
-	int num_to_alloc;
1670
+	yy_size_t num_to_alloc;
1682 1671
     
1683 1672
 	if (!(yy_buffer_stack)) {
1684 1673
 
@@ -1686,15 +1675,15 @@ static void yyensure_buffer_stack (void)
1686 1675
 		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
1687 1676
 		 * immediate realloc on the next call.
1688 1677
          */
1689
-      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
1678
+		num_to_alloc = 1;
1690 1679
 		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
1691 1680
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
1692 1681
 								);
1693 1682
 		if ( ! (yy_buffer_stack) )
1694 1683
 			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
1695
-
1684
+								  
1696 1685
 		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
1697
-
1686
+				
1698 1687
 		(yy_buffer_stack_max) = num_to_alloc;
1699 1688
 		(yy_buffer_stack_top) = 0;
1700 1689
 		return;
@@ -1703,7 +1692,7 @@ static void yyensure_buffer_stack (void)
1703 1692
 	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
1704 1693
 
1705 1694
 		/* Increase the buffer to prepare for a possible push. */
1706
-		yy_size_t grow_size = 8 /* arbitrary grow size */;
1695
+		int grow_size = 8 /* arbitrary grow size */;
1707 1696
 
1708 1697
 		num_to_alloc = (yy_buffer_stack_max) + grow_size;
1709 1698
 		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
@@ -1723,7 +1712,7 @@ static void yyensure_buffer_stack (void)
1723 1712
  * @param base the character buffer
1724 1713
  * @param size the size in bytes of the character buffer
1725 1714
  * 
1726
- * @return the newly allocated buffer state object.
1715
+ * @return the newly allocated buffer state object. 
1727 1716
  */
1728 1717
 YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
1729 1718
 {
@@ -1733,7 +1722,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
1733 1722
 	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
1734 1723
 	     base[size-1] != YY_END_OF_BUFFER_CHAR )
1735 1724
 		/* They forgot to leave room for the EOB's. */
1736
-		return NULL;
1725
+		return 0;
1737 1726
 
1738 1727
 	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
1739 1728
 	if ( ! b )
@@ -1742,7 +1731,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
1742 1731
 	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
1743 1732
 	b->yy_buf_pos = b->yy_ch_buf = base;
1744 1733
 	b->yy_is_our_buffer = 0;
1745
-	b->yy_input_file = NULL;
1734
+	b->yy_input_file = 0;
1746 1735
 	b->yy_n_chars = b->yy_buf_size;
1747 1736
 	b->yy_is_interactive = 0;
1748 1737
 	b->yy_at_bol = 1;
@@ -1765,25 +1754,24 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
1765 1754
 YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
1766 1755
 {
1767 1756
     
1768
-	return yy_scan_bytes(yystr,(int) strlen(yystr) );
1757
+	return yy_scan_bytes(yystr,strlen(yystr) );
1769 1758
 }
1770 1759
 
1771 1760
 /** Setup the input buffer state to scan the given bytes. The next call to yylex() will
1772 1761
  * scan from a @e copy of @a bytes.
1773
- * @param yybytes the byte buffer to scan
1774
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
1762
+ * @param bytes the byte buffer to scan
1763
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
1775 1764
  * 
1776 1765
  * @return the newly allocated buffer state object.
1777 1766
  */
1778
-YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
1767
+YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len )
1779 1768
 {
1780 1769
 	YY_BUFFER_STATE b;
1781 1770
 	char *buf;
1782
-	yy_size_t n;
1783
-	int i;
1771
+	yy_size_t n, i;
1784 1772
     
1785 1773
 	/* Get memory for full buffer, including space for trailing EOB's. */
1786
-	n = (yy_size_t) (_yybytes_len + 2);
1774
+	n = _yybytes_len + 2;
1787 1775
 	buf = (char *) yyalloc(n  );
1788 1776
 	if ( ! buf )
1789 1777
 		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
@@ -1809,9 +1797,9 @@ YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
1809 1797
 #define YY_EXIT_FAILURE 2
1810 1798
 #endif
1811 1799
 
1812
-static void yynoreturn yy_fatal_error (yyconst char* msg )
1800
+static void yy_fatal_error (yyconst char* msg )
1813 1801
 {
1814
-			(void) fprintf( stderr, "%s\n", msg );
1802
+    	(void) fprintf( stderr, "%s\n", msg );
1815 1803
 	exit( YY_EXIT_FAILURE );
1816 1804
 }
1817 1805
 
@@ -1839,7 +1827,7 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
1839 1827
  */
1840 1828
 int yyget_lineno  (void)
1841 1829
 {
1842
-    
1830
+        
1843 1831
     return yylineno;
1844 1832
 }
1845 1833
 
@@ -1862,7 +1850,7 @@ FILE *yyget_out  (void)
1862 1850
 /** Get the length of the current token.
1863 1851
  * 
1864 1852
  */
1865
-int yyget_leng  (void)
1853
+yy_size_t yyget_leng  (void)
1866 1854
 {
1867 1855
         return yyleng;
1868 1856
 }
@@ -1877,29 +1865,29 @@ char *yyget_text  (void)
1877 1865
 }
1878 1866
 
1879 1867
 /** Set the current line number.
1880
- * @param _line_number line number
1868
+ * @param line_number
1881 1869
  * 
1882 1870
  */
1883
-void yyset_lineno (int  _line_number )
1871
+void yyset_lineno (int  line_number )
1884 1872
 {
1885 1873
     
1886
-    yylineno = _line_number;
1874
+    yylineno = line_number;
1887 1875
 }
1888 1876
 
1889 1877
 /** Set the input stream. This does not discard the current
1890 1878
  * input buffer.
1891
- * @param _in_str A readable stream.
1879
+ * @param in_str A readable stream.
1892 1880
  * 
1893 1881
  * @see yy_switch_to_buffer
1894 1882
  */
1895
-void yyset_in (FILE *  _in_str )
1883
+void yyset_in (FILE *  in_str )
1896 1884
 {
1897
-        yyin = _in_str ;
1885
+        yyin = in_str ;
1898 1886
 }
1899 1887
 
1900
-void yyset_out (FILE *  _out_str )
1888
+void yyset_out (FILE *  out_str )
1901 1889
 {
1902
-        yyout = _out_str ;
1890
+        yyout = out_str ;
1903 1891
 }
1904 1892
 
1905 1893
 int yyget_debug  (void)
@@ -1907,9 +1895,9 @@ int yyget_debug  (void)
1907 1895
         return yy_flex_debug;
1908 1896
 }
1909 1897
 
1910
-void yyset_debug (int  _bdebug )
1898
+void yyset_debug (int  bdebug )
1911 1899
 {
1912
-        yy_flex_debug = _bdebug ;
1900
+        yy_flex_debug = bdebug ;
1913 1901
 }
1914 1902
 
1915 1903
 static int yy_init_globals (void)
@@ -1918,10 +1906,10 @@ static int yy_init_globals (void)
1918 1906
      * This function is called from yylex_destroy(), so don't allocate here.
1919 1907
      */
1920 1908
 
1921
-    (yy_buffer_stack) = NULL;
1909
+    (yy_buffer_stack) = 0;
1922 1910
     (yy_buffer_stack_top) = 0;
1923 1911
     (yy_buffer_stack_max) = 0;
1924
-    (yy_c_buf_p) = NULL;
1912
+    (yy_c_buf_p) = (char *) 0;
1925 1913
     (yy_init) = 0;
1926 1914
     (yy_start) = 0;
1927 1915
 
@@ -1930,8 +1918,8 @@ static int yy_init_globals (void)
1930 1918
     yyin = stdin;
1931 1919
     yyout = stdout;
1932 1920
 #else
1933
-    yyin = NULL;
1934
-    yyout = NULL;
1921
+    yyin = (FILE *) 0;
1922
+    yyout = (FILE *) 0;
1935 1923
 #endif
1936 1924
 
1937 1925
     /* For future reference: Set errno on error, since we are called by
@@ -1969,8 +1957,7 @@ int yylex_destroy  (void)
1969 1957
 #ifndef yytext_ptr
1970 1958
 static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
1971 1959
 {
1972
-		
1973
-	int i;
1960
+	register int i;
1974 1961
 	for ( i = 0; i < n; ++i )
1975 1962
 		s1[i] = s2[i];
1976 1963
 }
@@ -1979,7 +1966,7 @@ static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
1979 1966
 #ifdef YY_NEED_STRLEN
1980 1967
 static int yy_flex_strlen (yyconst char * s )
1981 1968
 {
1982
-	int n;
1969
+	register int n;
1983 1970
 	for ( n = 0; s[n]; ++n )
1984 1971
 		;
1985 1972
 
@@ -1989,12 +1976,11 @@ static int yy_flex_strlen (yyconst char * s )
1989 1976
 
1990 1977
 void *yyalloc (yy_size_t  size )
1991 1978
 {
1992
-			return malloc(size);
1979
+	return (void *) malloc( size );
1993 1980
 }
1994 1981
 
1995 1982
 void *yyrealloc  (void * ptr, yy_size_t  size )
1996 1983
 {
1997
-		
1998 1984
 	/* The cast to (char *) in the following accommodates both
1999 1985
 	 * implementations that use char* generic pointers, and those
2000 1986
 	 * that use void* generic pointers.  It works with the latter
@@ -2002,12 +1988,12 @@ void *yyrealloc  (void * ptr, yy_size_t  size )
2002 1988
 	 * any pointer type to void*, and deal with argument conversions
2003 1989
 	 * as though doing an assignment.
2004 1990
 	 */
2005
-	return realloc(ptr, size);
1991
+	return (void *) realloc( (char *) ptr, size );
2006 1992
 }
2007 1993
 
2008 1994
 void yyfree (void * ptr )
2009 1995
 {
2010
-			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
1996
+	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
2011 1997
 }
2012 1998
 
2013 1999
 #define YYTABLES_NAME "yytables"

+ 31 - 10
tac/main.c

@@ -227,6 +227,7 @@ NODE** get_val_list(NODE *tree) {
227 227
 }
228 228
 
229 229
 TOKEN* build_tac(NODE *tree, TACS* tac, TACS* after_tac) {
230
+  printf("%s\n", named(tree->type));
230 231
   if (tree == NULL) return NULL;
231 232
   int type = tree->type;
232 233
   if (type == LEAF) {
@@ -275,6 +276,7 @@ TOKEN* build_tac(NODE *tree, TACS* tac, TACS* after_tac) {
275 276
     new_tac(tac, NULL, src, NULL, RETURN);
276 277
   } else if (type == 'D') {
277 278
     TACS* gen_tac = (TACS*) malloc(sizeof(TACS));
279
+    gen_tac->list = NULL;
278 280
     new_tac(after_tac, (TOKEN*) tree->left->right->left->left, NULL, NULL, 'D');
279 281
     if (tree->left->right->right != NULL) {
280 282
       TOKEN** arg_list = get_argument_list(tree);
@@ -342,7 +344,7 @@ int register_me(TOKEN* name, ENV* env) {
342 344
           levels++;
343 345
           BIND *binding = find_name_in_list(name, env_ptr->bindings);
344 346
           if (binding != NULL) {
345
-            printf("lw $%d, %d($fp)\n", tmp_regs[tmp_cntr], binding->env_offset);
347
+            printf("lw $%d, %d($fp)\n", tmp_regs[tmp_cntr], 8+binding->env_offset*4);
346 348
             printf("or $fp, $k0, $0\n");
347 349
             return tmp_regs[tmp_cntr++];
348 350
           }
@@ -377,11 +379,12 @@ int def_register_me(TOKEN* name, ENV* env) {
377 379
   }
378 380
 }
379 381
 
380
-void add_closure(TOKEN* name, ENV* env) {
382
+void add_closure(TOKEN* name, ENV* env, ENV* parent) {
383
+  ENV* penv = create_new_function_env(parent, NULL);
381 384
   BIND* binding = find_name_in_list(name, env->bindings);
382 385
   if (binding == NULL) {
383 386
     BIND* new_bind;
384
-    new_bind =create_binding(name, 0, env);
387
+    new_bind =create_binding(name, 0, penv);
385 388
     if (env->bindings == NULL) env->bindings = create_list(new_bind, NULL);
386 389
     else append_list(env->bindings, new_bind);
387 390
   } else {
@@ -438,13 +441,14 @@ void compile_tac(TLIST* tacs) {
438 441
       ENV* closure_env;
439 442
       int i = 2;
440 443
       int j;
444
+      printf("%s:\n", t->dst->lexeme);
445
+      alloc_function_env();
441 446
       if ((closure_env = find_closure_env(t->dst, closure_tab)) == NULL) {
442 447
         env = create_new_function_env(env, env);
443 448
       } else {
444 449
         env = create_new_function_env(closure_env, env);
450
+        printf("sw $k1, 68($v0)\n");
445 451
       }
446
-      printf("%s:\n", t->dst->lexeme);
447
-      alloc_function_env();
448 452
       printf("sw $fp, 4($v0)\n");
449 453
       if (t->dst != lookup_token("main")) {
450 454
         for (j = 0; j < 8; j++) {
@@ -523,7 +527,15 @@ void compile_tac(TLIST* tacs) {
523 527
     if (t->op == APPLY) {
524 528
       int tgt_idx = register_me(t->tgt, env);
525 529
       env->arg_counter = 0;
526
-      printf("jal %s\n", stok(t->dst));
530
+      if (find_name_in_env(t->dst, env) != NULL) {
531
+        // we a closure
532
+        int c_reg = register_me(t->dst, env);
533
+        printf("lw $gp, 0($%d)\n", c_reg);
534
+        printf("or $k1, $0, $%d\n", c_reg);
535
+        printf("jalr $gp\n");
536
+      } else {
537
+        printf("jal %s\n", stok(t->dst));
538
+      }
527 539
       printf("lw $fp, 4($fp)\n");
528 540
       printf("lw $ra, 64($fp)\n");
529 541
       if (env->bindings != NULL) {
@@ -547,6 +559,14 @@ void compile_tac(TLIST* tacs) {
547 559
     }
548 560
     if (t->op == RETURN) {
549 561
       int src_idx = register_me(t->src, env);
562
+      int j=0;
563
+      int i=2;
564
+      if (t->dst != lookup_token("main")) {
565
+        for (j = 0; j < 8; j++) {
566
+          printf("sw $%d, %d($fp)\n", svd_regs[j], i*4);
567
+          i++;
568
+        }
569
+      }
550 570
       printf("or $v1, $0, $%d\n", src_idx);
551 571
       printf("jr $31\n");
552 572
     }
@@ -560,7 +580,7 @@ void compile_tac(TLIST* tacs) {
560 580
     }
561 581
     if (t->op == 280) {
562 582
       int dst_idx = def_register_me(t->dst, env);
563
-      add_closure(t->dst, closure_tab);
583
+      add_closure(t->dst, closure_tab, env);
564 584
       alloc_function_env();
565 585
       printf("or $%d, $v0, $0\n", dst_idx);
566 586
       printf("la $v0, %s\n", t->dst->lexeme);
@@ -587,15 +607,16 @@ void compile_tac(TLIST* tacs) {
587 607
 
588 608
 void interpret_tree(NODE *tree) {
589 609
   TACS* gen_tac = (TACS*) malloc(sizeof(TACS));
610
+  gen_tac->list = NULL;
590 611
   build_tac(tree, gen_tac, gen_tac);
591 612
   print_tac(gen_tac->list);
592 613
   compile_tac(gen_tac->list);
593 614
 }
594 615
 
595 616
 extern int yydebug;
596
-#ifdef __APPLE__
597
-extern NODE* yyparse(void);
598
-#endif
617
+/* #ifdef __APPLE__ */
618
+/* extern NODE* yyparse(void); */
619
+/* #endif */
599 620
 extern NODE* ans;
600 621
 extern void init_symbtable(void);
601 622
 

+ 0 - 122
tac/recursion.asm

@@ -1,122 +0,0 @@
1
-.globl __start
2
-__start:
3
-li $a0, 68
4
-li $v0, 9
5
-syscall
6
-or $fp, $0, $v0
7
-la $t0, main
8
-sw $t0, 0($fp)
9
-sw $0, 4($fp)
10
-jal main
11
-j done
12
-fact:
13
-li $a0, 68
14
-li $v0, 9
15
-syscall
16
-sw $fp, 4($v0)
17
-sw $16, 8($fp)
18
-sw $17, 12($fp)
19
-sw $18, 16($fp)
20
-sw $19, 20($fp)
21
-sw $20, 24($fp)
22
-sw $21, 28($fp)
23
-sw $22, 32($fp)
24
-sw $23, 36($fp)
25
-or $fp, $0, $v0
26
-la $t0, fact
27
-sw $t0, 0($fp)
28
-sw $ra, 64($fp)
29
-or $16, $0, $5
30
-or $5, $0, $16
31
-li $8, 1
32
-or $6, $0, $8
33
-jal inner_fact
34
-lw $fp, 4($fp)
35
-lw $ra, 64($fp)
36
-lw $16, 8($fp)
37
-or $9, $0, $v1
38
-or $v1, $0, $9
39
-jr $31
40
-inner_fact:
41
-li $a0, 68
42
-li $v0, 9
43
-syscall
44
-sw $fp, 4($v0)
45
-sw $16, 8($fp)
46
-sw $17, 12($fp)
47
-sw $18, 16($fp)
48
-sw $19, 20($fp)
49
-sw $20, 24($fp)
50
-sw $21, 28($fp)
51
-sw $22, 32($fp)
52
-sw $23, 36($fp)
53
-or $fp, $0, $v0
54
-la $t0, inner_fact
55
-sw $t0, 0($fp)
56
-sw $ra, 64($fp)
57
-or $16, $0, $5
58
-or $17, $0, $6
59
-bne $16, $0, L0
60
-or $v1, $0, $17
61
-jr $31
62
-L0:
63
-li $11, 1
64
-sub $10, $16, $11
65
-mult $17, $16
66
-mflo $12
67
-or $5, $0, $10
68
-or $6, $0, $12
69
-jal inner_fact
70
-lw $fp, 4($fp)
71
-lw $ra, 64($fp)
72
-lw $16, 8($fp)
73
-lw $17, 12($fp)
74
-or $13, $0, $v1
75
-or $v1, $0, $13
76
-jr $31
77
-main:
78
-li $a0, 68
79
-li $v0, 9
80
-syscall
81
-sw $fp, 4($v0)
82
-or $fp, $0, $v0
83
-la $t0, main
84
-sw $t0, 0($fp)
85
-sw $ra, 64($fp)
86
-li $14, 3
87
-or $5, $0, $14
88
-jal fact
89
-lw $fp, 4($fp)
90
-lw $ra, 64($fp)
91
-or $15, $0, $v1
92
-or $16, $0, $15
93
-li $24, 5
94
-or $5, $0, $24
95
-jal fact
96
-lw $fp, 4($fp)
97
-lw $ra, 64($fp)
98
-lw $16, 8($fp)
99
-or $25, $0, $v1
100
-or $17, $0, $25
101
-li $8, 7
102
-or $5, $0, $8
103
-jal fact
104
-lw $fp, 4($fp)
105
-lw $ra, 64($fp)
106
-lw $16, 8($fp)
107
-lw $17, 12($fp)
108
-or $9, $0, $v1
109
-or $18, $0, $9
110
-add $10, $16, $17
111
-add $11, $10, $18
112
-or $v1, $0, $11
113
-jr $31
114
-done:
115
-or $a0, $v1, $0
116
-ori $v0, $0, 1
117
-syscall
118
-ori $a0, $0, 0xA
119
-ori $v0, $0, 0xB
120
-syscall
121
-ori $v0, $0, 10
122
-syscall

+ 8 - 2
tac/tests/Makefile

@@ -1,9 +1,15 @@
1 1
 OUT:=$(patsubst %.c, %.asm, $(wildcard *.c))
2
+OS:=$(shell uname)
3
+ifeq ($(OS),Darwin)
4
+	SED:=gsed
5
+else
6
+	SED:=sed
7
+endif
2 8
 
3 9
 all: $(OUT)
4 10
 
5
-%.asm: %.c
6
-	../mycc < $< | sed -n '/^=\{5\}$$/ { s///; :a; n; p; ba; }' > $@
11
+%.asm: %.c ../mycc
12
+	../mycc < $< | $(SED) -n '/^=\{5\}$$/ { s///; :a; n; p; ba; }' > $@
7 13
 
8 14
 clean:
9 15
 	rm -rf *.asm

+ 2 - 4
tac/tests/all_scopes.c

@@ -1,6 +1,4 @@
1
-/* ##answer: 220 */
2
-int y = 5;
3
-
1
+/* ##answer: 44 */
4 2
 int fun1(){
5 3
 	int x = 11;
6 4
 	return x;
@@ -9,5 +7,5 @@ int fun1(){
9 7
 
10 8
 int main() { 
11 9
 	int x = 4;
12
-	return y * x * fun1();
10
+	return x * fun1();
13 11
 }

+ 2 - 5
tac/tests/cplus.c

@@ -1,4 +1,4 @@
1
-/* ##answer: 29 */
1
+/* ##answer: 7 */
2 2
 function cplus(int a) {
3 3
   int cplusa(int b) {
4 4
     return a + b;
@@ -9,9 +9,6 @@ function cplus(int a) {
9 9
 
10 10
 int main() {
11 11
   int x = cplus(5);
12
-  int y = x;
13
-  int f = cplus(2);
14
-  int z = y;
15 12
 
16
-  return x(2) + f(2) + y(5) + z(3);
13
+  return x(2);
17 14
 }

+ 0 - 14
tac/tests/deep_closure.c

@@ -1,14 +0,0 @@
1
-/* ##answer: 18 */
2
-function cplus(int a) {
3
-  int cplusa(int b) {
4
-    int cplusab(int c) {
5
-      return a + b + c;
6
-    }
7
-    return cplusab;
8
-  }
9
-  return cplusa;
10
-}
11
-
12
-int main() {
13
-  return cplus(5)(6)(7);
14
-}

+ 0 - 11
tac/tests/immed_call.c

@@ -1,11 +0,0 @@
1
-/* ##answer: 11 */
2
-function cplus(int a) {
3
-  int cplusa(int b) {
4
-    return a + b;
5
-  }
6
-  return cplusa;
7
-}
8
-
9
-int main() {
10
-  return cplus(5)(6);
11
-}

+ 0 - 20
tac/tests/really_deep_closure.c

@@ -1,20 +0,0 @@
1
-/* ##answer: 15 */
2
-function cplus(int a) {
3
-  int cplusa(int b) {
4
-    int cplusab(int c) {
5
-      int cplusabc(int d) {
6
-        int cplusabcd(int e) {
7
-          return a+b+c+d+e;
8
-        }
9
-        return cplusabcd;
10
-      }
11
-      return cplusabc;
12
-    }
13
-    return cplusab;
14
-  }
15
-  return cplusa;
16
-}
17
-
18
-int main() {
19
-  return cplus(1)(2)(3)(4)(5);
20
-}

+ 4 - 5
tac/tests/twice.c

@@ -1,15 +1,14 @@
1 1
 /* ##answer: 12*/
2
-int whammy(int a) {
3
-  return a + 5;
4
-}
5
-
6 2
 function twice(function f) {
7 3
   int g(int x) { return f(f(x)); }
8 4
   return g;
9 5
 }
10 6
 
11 7
 int main() {
12
-  doublewhammy = twice(whammy);
8
+  int whammy(int a) {
9
+    return a + 5;
10
+  }
11
+  function doublewhammy = twice(whammy);
13 12
 
14 13
   return doublewhammy(2);
15 14
 }