Matt Coles пре 8 година
родитељ
комит
ac55ae73ee
20 измењених фајлова са 1417 додато и 1371 уклоњено
  1. 9 2
      cw/main.c
  2. 7 14
      cw/simple.c
  3. 0 21
      cw/simple.c.orig
  4. 0 21
      cw/simple_BACKUP_23755.c
  5. 0 21
      cw/simple_BACKUP_24791.c
  6. 0 15
      cw/simple_BASE_23755.c
  7. 0 15
      cw/simple_BASE_24791.c
  8. 0 16
      cw/simple_LOCAL_23755.c
  9. 0 16
      cw/simple_LOCAL_24791.c
  10. 0 8
      cw/simple_REMOTE_23755.c
  11. 0 8
      cw/simple_REMOTE_24791.c
  12. 2 0
      cw/tests/func_args.c
  13. 11 0
      cw/tests/immed_call.c
  14. 1027 978
      tac/C.tab.c
  15. 61 47
      tac/C.tab.h
  16. 124 138
      tac/lex.yy.c
  17. 18 19
      tac/main.c
  18. 3 12
      tac/simple.c
  19. 111 20
      tac/test.asm
  20. 44 0
      tac/wew.asm

+ 9 - 2
cw/main.c

@@ -274,8 +274,15 @@ BIND* recursive_interpret(NODE *tree, ENV *env_ptr) {
274 274
     return NULL;
275 275
   }
276 276
   if (tree->type==APPLY) {
277
-    TOKEN* func_name = ((TOKEN*) tree->left->left);
278
-    BIND* func = find_name_in_env(func_name, env_ptr);
277
+    BIND* func;
278
+    TOKEN* func_name;
279
+    if (tree->left->type == APPLY) {
280
+      func = recursive_interpret(tree->left, env_ptr);
281
+      func_name = lookup_token("$anonFunc");
282
+    } else {
283
+      func_name = ((TOKEN*) tree->left->left);
284
+      func = find_name_in_env(func_name, env_ptr);
285
+    }
279 286
     if (func == NULL) {
280 287
       printf("Could not find binding for function with name %s\n", func_name->lexeme);
281 288
       exit(1);

+ 7 - 14
cw/simple.c

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

+ 0 - 21
cw/simple.c.orig

@@ -1,21 +0,0 @@
1
-<<<<<<< HEAD
2
-int whammy(int a) {
3
-  int x = a;
4
-  return x + 5;
5
-}
6
-
7
-function twice(function f) {
8
-  int g(int x) { return f(f(x)); }
9
-  return g;
10
-}
11
-
12
-=======
13
->>>>>>> 890548e7968c2e8be77eb6170819538f116397bd
14
-int main() {
15
-  int b = 4;
16
-
17
-  int a = b();
18
-
19
-  return x;
20
-}
21
-

+ 0 - 21
cw/simple_BACKUP_23755.c

@@ -1,21 +0,0 @@
1
-<<<<<<< HEAD
2
-int whammy(int a) {
3
-  int x = a;
4
-  return x + 5;
5
-}
6
-
7
-function twice(function f) {
8
-  int g(int x) { return f(f(x)); }
9
-  return g;
10
-}
11
-
12
-=======
13
->>>>>>> 890548e7968c2e8be77eb6170819538f116397bd
14
-int main() {
15
-  int b = 4;
16
-
17
-  int a = b();
18
-
19
-  return x;
20
-}
21
-

+ 0 - 21
cw/simple_BACKUP_24791.c

@@ -1,21 +0,0 @@
1
-<<<<<<< HEAD
2
-int whammy(int a) {
3
-  int x = a;
4
-  return x + 5;
5
-}
6
-
7
-function twice(function f) {
8
-  int g(int x) { return f(f(x)); }
9
-  return g;
10
-}
11
-
12
-=======
13
->>>>>>> 890548e7968c2e8be77eb6170819538f116397bd
14
-int main() {
15
-  int b = 4;
16
-
17
-  int a = b();
18
-
19
-  return x;
20
-}
21
-

+ 0 - 15
cw/simple_BASE_23755.c

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

+ 0 - 15
cw/simple_BASE_24791.c

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

+ 0 - 16
cw/simple_LOCAL_23755.c

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

+ 0 - 16
cw/simple_LOCAL_24791.c

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

+ 0 - 8
cw/simple_REMOTE_23755.c

@@ -1,8 +0,0 @@
1
-int main() {
2
-  int b = 4;
3
-
4
-  int a = b();
5
-
6
-  return x;
7
-}
8
-

+ 0 - 8
cw/simple_REMOTE_24791.c

@@ -1,8 +0,0 @@
1
-int main() {
2
-  int b = 4;
3
-
4
-  int a = b();
5
-
6
-  return x;
7
-}
8
-

+ 2 - 0
cw/tests/func_args.c

@@ -3,10 +3,12 @@ int y = 0;
3 3
 
4 4
 int incr_y(int a, int b) {
5 5
   y = y + a + b;
6
+  return 0;
6 7
 }
7 8
 
8 9
 int blah() {
9 10
   y = 2;
11
+  return 0;
10 12
 }
11 13
 
12 14
 int main() {

+ 11 - 0
cw/tests/immed_call.c

@@ -0,0 +1,11 @@
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
+}

Разлика између датотеке није приказан због своје велике величине
+ 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"

+ 18 - 19
tac/main.c

@@ -300,7 +300,6 @@ int tmp_regs[10] = {8, 9, 10, 11, 12, 13, 14, 15, 24, 25};
300 300
 int svd_regs[8]  = {16, 17, 18, 19, 20, 21, 22, 23};
301 301
 int arg_regs[3] = {5, 6, 7};
302 302
 int tmp_cntr = 0;
303
-int var_cntr = 0;
304 303
 
305 304
 int register_me(TOKEN* name, ENV* env) {
306 305
   if (tmp_cntr == 10) tmp_cntr = 0;
@@ -347,8 +346,8 @@ void compile_tac(TLIST* tacs) {
347 346
   printf("la $t0, main\n");
348 347
   printf("sw $t0, 0($fp)\n");
349 348
   printf("sw $0, 4($fp)\n");
350
-  printf("la $ra, done\n");
351
-  printf("j main\n");
349
+  printf("jal main\n");
350
+  printf("j done\n");
352 351
   while(tacs != NULL) {
353 352
     TAC_T* t = tacs->elem;
354 353
     if (debug) {
@@ -363,6 +362,22 @@ void compile_tac(TLIST* tacs) {
363 362
     if (t->op == 'D') {
364 363
       env = create_new_function_env(NULL, env);
365 364
       printf("%s:\n", t->dst->lexeme);
365
+      alloc_function_env();
366
+      printf("sw $fp, 4($v0)\n");
367
+      if (env->previous->bindings != NULL) {
368
+        int i = 2;
369
+        BLIST* ptr = env->previous->bindings;
370
+        while (ptr != NULL) {
371
+          if (ptr->binding->name->lexeme[0] != '$') {
372
+            printf("sw $%d, %d($fp)\n", svd_regs[ptr->binding->env_offset], i*4);
373
+            i++;
374
+          }
375
+          ptr = ptr->next;
376
+        }
377
+      }
378
+      printf("or $fp, $0, $v0\n");
379
+      printf("la $t0, %s\n", stok(t->dst));
380
+      printf("sw $t0, 0($fp)\n");
366 381
       printf("sw $ra, 64($fp)\n");
367 382
     }
368 383
     if (t->op == '+') {
@@ -431,22 +446,6 @@ void compile_tac(TLIST* tacs) {
431 446
     if (t->op == APPLY) {
432 447
       int tgt_idx = register_me(t->tgt, env);
433 448
       env->arg_counter = 0;
434
-      alloc_function_env();
435
-      printf("sw $fp, 4($v0)\n");
436
-      if (env->bindings != NULL) {
437
-        int i = 2;
438
-        BLIST* ptr = env->bindings;
439
-        while (ptr != NULL) {
440
-          if (ptr->binding->name->lexeme[0] != '$') {
441
-            printf("sw $%d, %d($fp)\n", svd_regs[ptr->binding->env_offset], i*4);
442
-            i++;
443
-          }
444
-          ptr = ptr->next;
445
-        }
446
-      }
447
-      printf("or $fp, $0, $v0\n");
448
-      printf("la $t0, %s\n", stok(t->dst));
449
-      printf("sw $t0, 0($fp)\n");
450 449
       printf("jal %s\n", stok(t->dst));
451 450
       printf("lw $fp, 4($fp)\n");
452 451
       printf("lw $ra, 64($fp)\n");

+ 3 - 12
tac/simple.c

@@ -1,15 +1,6 @@
1
-int blah(int b) {
2
-  int y = 3;
3
-  return y + b;
1
+int times(int x, int y) {
2
+  return x * y;
4 3
 }
5
-
6 4
 int main() {
7
-  int y = 4;
8
-  int x = blah(4);
9
-  if (x > 5) {
10
-    y = y+10;
11
-  } else {
12
-    y = y+5;
13
-  }
14
-  return x+y;
5
+  return times(4+5, times(2, 4));
15 6
 }

+ 111 - 20
tac/test.asm

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

+ 44 - 0
tac/wew.asm

@@ -0,0 +1,44 @@
1
+li $a0, 68
2
+li $v0, 9
3
+syscall
4
+or $fp, $0, $v0
5
+la $t0, main
6
+sw $t0, 0($fp)
7
+sw $0, 4($fp)
8
+jal main
9
+j done
10
+return_five:
11
+li $a0, 68
12
+li $v0, 9
13
+syscall
14
+sw $fp, 4($v0)
15
+or $fp, $0, $v0
16
+la $t0, return_five
17
+sw $t0, 0($fp)
18
+sw $ra, 64($fp)
19
+li $8, 5
20
+or $v1, $0, $8
21
+jr $31
22
+main:
23
+li $a0, 68
24
+li $v0, 9
25
+syscall
26
+sw $fp, 4($v0)
27
+or $fp, $0, $v0
28
+la $t0, main
29
+sw $t0, 0($fp)
30
+sw $ra, 64($fp)
31
+jal return_five
32
+lw $fp, 4($fp)
33
+lw $ra, 64($fp)
34
+or $9, $0, $v1
35
+jal return_five
36
+lw $fp, 4($fp)
37
+lw $ra, 64($fp)
38
+or $10, $0, $v1
39
+add $11, $9, $10
40
+or $v1, $0, $11
41
+jr $31
42
+done:
43
+ori $v0, $0, 10
44
+syscall