1 /* M A I N P R O G R A M */
21 #include "tokenname.h"
28 char *input = "input";
29 char *output = "output";
35 extern int fp_used; /* set if floating point used */
41 register int Nargc = 1;
42 register char **Nargv = &argv[0];
48 DoOption((*argv++) + 1);
50 Nargv[Nargc++] = *argv++;
52 Nargv[Nargc] = 0; /* terminate the arg vector */
54 fprint(STDERR, "%s: Use a file argument\n", ProgName);
57 if(!Compile(Nargv[1], Nargv[2])) sys_stop(S_EXIT);
64 extern struct tokenname tkidf[];
65 extern struct tokenname tkstandard[];
68 if( !InsertFile(src, (char **) 0, &src) ) {
69 fprint(STDERR, "%s: cannot open %s\n", ProgName, src);
79 CheckForLineDirective();
80 tk = LLlex(); /* Read the first token and put */
81 aside = dot; /* it aside. In this way, options */
82 asidetype = toktype; /* inside comments will be seen */
83 dot.tk_symb = tk; /* before the program starts. */
89 if( options['c'] ) tkclass['"'] = STSTR;
90 if( options['u'] || options['U'] ) {
94 if( tk == '"' || tk == '_' ) {
102 return 0; /* running the optimizer is not very useful */
105 C_init(word_size, pointer_size);
107 fatal("couldn't open output file");
109 C_ms_emx(word_size, pointer_size);
112 C_ms_std(FileName, N_SO, 0);
114 #endif /* DBSYMTAB */
116 C_df_dlb(++data_label);
117 C_rom_scon(FileName,(arith) strlen(FileName) + 1);
119 C_ms_src((int)LineNumber - 1, FileName);
120 if( fp_used ) C_ms_flt();
123 if( options['I'] ) Info();
125 return !err_occurred;
131 register struct token *tkp = ˙
132 extern char *symbol2str();
134 while( LLlex() > 0 ) {
135 print(">>> %s ", symbol2str(tkp->tk_symb));
136 switch( tkp->tk_symb ) {
138 print("%s\n", tkp->TOK_IDF->id_text);
142 print("%ld\n", tkp->TOK_INT);
146 print("%s\n", tkp->TOK_REL);
150 print("'%s'\n", tkp->TOK_STR);
162 register struct def *df;
163 extern struct def *Enter();
164 static struct node maxintnode = { 0, 0, Value, 0, { INTEGER, 0 } };
168 /* File handling procedures, Read(ln) & Write(ln) are handled
172 df = Enter("false", D_ENUM, bool_type, 0);
174 df->df_flags |= D_SET;
175 bool_type->enm_enums = df;
176 df->enm_next = Enter("true", D_ENUM, bool_type, 0);
177 df->enm_next->enm_val = 1;
178 df->df_flags |= D_SET;
179 df->enm_next->enm_next = NULLDEF;
181 (void) Enter("rewrite", D_PROCEDURE, std_type, R_REWRITE);
182 (void) Enter("put", D_PROCEDURE, std_type, R_PUT);
183 (void) Enter("reset", D_PROCEDURE, std_type, R_RESET);
184 (void) Enter("get", D_PROCEDURE, std_type, R_GET);
185 (void) Enter("page", D_PROCEDURE, std_type, R_PAGE);
187 /* DYNAMIC ALLOCATION PROCEDURES */
188 (void) Enter("new", D_PROCEDURE, std_type, R_NEW);
189 (void) Enter("dispose", D_PROCEDURE, std_type, R_DISPOSE);
190 if( !options['s'] ) {
191 (void) Enter("mark", D_PROCEDURE, std_type, R_MARK);
192 (void) Enter("release", D_PROCEDURE, std_type, R_RELEASE);
195 /* MISCELLANEOUS PROCEDURE(S) */
197 (void) Enter("halt", D_PROCEDURE, std_type, R_HALT);
199 /* TRANSFER PROCEDURES */
200 (void) Enter("pack", D_PROCEDURE, std_type, R_PACK);
201 (void) Enter("unpack", D_PROCEDURE, std_type, R_UNPACK);
205 /* ARITHMETIC FUNCTIONS */
206 (void) Enter("abs", D_FUNCTION, std_type, R_ABS);
207 (void) Enter("sqr", D_FUNCTION, std_type, R_SQR);
208 (void) Enter("sin", D_FUNCTION, std_type, R_SIN);
209 (void) Enter("cos", D_FUNCTION, std_type, R_COS);
210 (void) Enter("exp", D_FUNCTION, std_type, R_EXP);
211 (void) Enter("ln", D_FUNCTION, std_type, R_LN);
212 (void) Enter("sqrt", D_FUNCTION, std_type, R_SQRT);
213 (void) Enter("arctan", D_FUNCTION, std_type, R_ARCTAN);
215 /* TRANSFER FUNCTIONS */
216 (void) Enter("trunc", D_FUNCTION, std_type, R_TRUNC);
217 (void) Enter("round", D_FUNCTION, std_type, R_ROUND);
219 /* ORDINAL FUNCTIONS */
220 (void) Enter("ord", D_FUNCTION, std_type, R_ORD);
221 (void) Enter("chr", D_FUNCTION, std_type, R_CHR);
222 (void) Enter("succ", D_FUNCTION, std_type, R_SUCC);
223 (void) Enter("pred", D_FUNCTION, std_type, R_PRED);
225 /* BOOLEAN FUNCTIONS */
226 (void) Enter("odd", D_FUNCTION, std_type, R_ODD);
227 (void) Enter("eof", D_FUNCTION, std_type, R_EOF);
228 (void) Enter("eoln", D_FUNCTION, std_type, R_EOLN);
231 (void) Enter("char", D_TYPE, char_type, 0);
232 (void) Enter("integer", D_TYPE, int_type, 0);
233 (void) Enter("real", D_TYPE, real_type, 0);
234 (void) Enter("boolean", D_TYPE, bool_type, 0);
235 (void) Enter("text", D_TYPE, text_type, 0);
236 (void) Enter("(void)", D_TYPE, void_type, 0);
239 (void) Enter("long", D_TYPE, long_type, 0);
241 (void) Enter("string", D_TYPE, string_type, 0);
244 (void) Enter("forward", D_FORWARD, error_type, 0);
245 (void) Enter("extern", D_EXTERN, error_type, 0);
248 /* nil is TOKEN and thus part of the grammar */
250 maxintnode.nd_type = int_type;
251 maxintnode.nd_INT = max_int; /* defined in cstoper.c */
252 df = define(str2idf("maxint", 0), CurrentScope, D_CONST);
253 df->df_type = int_type;
254 df->con_const = &maxintnode;
255 df->df_flags |= D_SET;
257 if (options['g']) stb_string(df, D_CONST);
258 #endif /* DBSYMTAB */
266 extern int cnt_def, cnt_node, cnt_paramlist, cnt_type, cnt_scope,
267 cnt_scopelist, cnt_tmpvar, cnt_withdesig,
268 cnt_case_hdr, cnt_case_entry;
271 %6d def\n%6d node\n%6d paramlist\n%6d type\n%6d scope\n%6d scopelist\n\
272 %6d lab\n%6d tmpvar\n%6d withdesig\n%6d casehdr\n%6d caseentry\n",
273 cnt_def, cnt_node, cnt_paramlist, cnt_type, cnt_scope, cnt_scopelist, cnt_lab, cnt_tmpvar, cnt_withdesig, cnt_case_hdr, cnt_case_entry);
274 print("\nNumber of lines read: %d\n", cntlines);