void *analyse(Program *prog) { //Generate the symbol table isValid = TRUE; sym_table *table = gen_sym_table(prog); //Analyse each proc Procs *procs = prog->procedures; while (procs != NULL) { Proc *p = procs->first; analyse_statements(p->body->statements, table, p->header->id); procs = procs->rest; } //For debug purposes; #ifdef DEBUG dump_symbol_table(table); #endif //Check for unused symbols check_unused_symbols(table, prog); //Perform simple analysis check_main(table); if (isValid) { return (void *) table; } else { return NULL; } }
void parse_file(PARROT_INTERP, int flexdebug, ARGIN(FILE *infile), ARGIN(char * const filename), int flags, int thr_id, unsigned macro_size, ARGMOD_NULLOK(char * const outputfile)) { ASSERT_ARGS(parse_file) yyscan_t yyscanner; lexer_state *lexer = NULL; /* create a yyscan_t object */ yypirlex_init(&yyscanner); /* set debug flag */ yypirset_debug(flexdebug, yyscanner); /* set the input file */ yypirset_in(infile, yyscanner); /* set the extra parameter in the yyscan_t structure */ lexer = new_lexer(interp, filename, flags); lexer->macro_size = macro_size; /* initialize the scanner state */ init_scanner_state(yyscanner); if (strstr(filename, ".pasm")) { /* PASM mode */ SET_FLAG(lexer->flags, LEXER_FLAG_PASMFILE); } yypirset_extra(lexer, yyscanner); /* and store the yyscanner in the lexer, so they're close buddies */ lexer->yyscanner = yyscanner; /* go parse */ yypirparse(yyscanner, lexer); if (lexer->parse_errors == 0) { char outfile[20]; sprintf(outfile, "output_thr_%d", thr_id); lexer->outfile = open_file(outfile, "w"); if (lexer->outfile == NULL) { fprintf(stderr, "Failed to open file %s\n", outfile); lexer->outfile = stdout; } if (TEST_FLAG(lexer->flags, LEXER_FLAG_NOOUTPUT)) /* handy for testing the compiler */ fprintf(stdout, "ok\n"); else if (TEST_FLAG(lexer->flags, LEXER_FLAG_PREPROCESS)) emit_pir_subs(lexer, outputfile); else if (TEST_FLAG(lexer->flags, LEXER_FLAG_OUTPUTPBC)) emit_pbc(lexer, outputfile); else /* fprintf(stderr, "Parse successful!\n"); */ print_subs(lexer); fclose(lexer->outfile); if (TEST_FLAG(lexer->flags, LEXER_FLAG_WARNINGS)) check_unused_symbols(lexer); } /* there may have been errors during the instruction generation, check again here. */ if (lexer->parse_errors > 0) fprintf(stderr, "There were %d errors\n", lexer->parse_errors); fclose(infile); /* XXX just want to make sure pirc doesn't segfault when doing bytecode stuff. */ /* if (TEST_FLAG(lexer->flags, LEXER_FLAG_OUTPUTPBC)) fprintf(stderr, "pirc ok\n"); */ /* clean up after playing */ release_resources(lexer); yypirlex_destroy(yyscanner); }
/* =item C<void parse_string(PARROT_INTERP, char *pirstring, int flags, int pasminput, unsigned macro_size)> Parse a PIR string. =cut */ void parse_string(PARROT_INTERP, ARGIN(char *pirstring), int flags, int pasminput, unsigned macro_size) { ASSERT_ARGS(parse_string) yyscan_t yyscanner; lexer_state *lexer = NULL; char name[64]; PackFile_ByteCode *old_cs, *new_cs; INTVAL eval_number; if (eval_nr == 0) MUTEX_INIT(eval_nr_lock); LOCK(eval_nr_lock); eval_number = ++eval_nr; UNLOCK(eval_nr_lock); snprintf(name, sizeof (name), "EVAL_" INTVAL_FMT, eval_number); new_cs = PF_create_default_segs(interp, Parrot_str_new(interp, name, strlen(name)), 0); old_cs = Parrot_switch_to_cs(interp, new_cs, 0); /* create a yyscan_t object */ yypirlex_init(&yyscanner); yypirset_debug(0, yyscanner); /* set the extra parameter in the yyscan_t structure */ lexer = new_lexer(interp, name, flags); lexer->macro_size = macro_size; yypirset_extra(lexer, yyscanner); lexer->yyscanner = yyscanner; /* initialize the scanner state */ init_scanner_state(yyscanner); /* set the scanner to a string buffer and go parse */ yypir_scan_string(pirstring, yyscanner); if (pasminput) { /* PASM mode */ SET_FLAG(lexer->flags, LEXER_FLAG_PASMFILE); } yypirparse(yyscanner, lexer); if (lexer->parse_errors == 0) { print_subs(lexer); if (TEST_FLAG(lexer->flags, LEXER_FLAG_WARNINGS)) check_unused_symbols(lexer); } /* there may have been errors during the instruction generation, check again here. */ if (lexer->parse_errors > 0) fprintf(stderr, "There were %d errors\n", lexer->parse_errors); /* XXX just want to make sure pirc doesn't segfault when doing bytecode stuff. */ if (TEST_FLAG(lexer->flags, LEXER_FLAG_OUTPUTPBC)) { emit_pbc(lexer, NULL); } /* fprintf(stderr, "ok\n"); */ /* clean up after playing */ release_resources(lexer); /* clean up after playing */ yypirlex_destroy(yyscanner); }