libcfx2 int cfx2_compile_command( const char* command, cfx2_Cmd** cmd_ptr, int flags ) { cfx2_IInput* input; Lexer* lexer; int error; /* First of all, test the arguments */ /* This is a bit more complicated than we would like it to be, because of the need for releasing /input/ */ if ( !command || !cmd_ptr ) return cfx2_param_invalid; /* construct an input stream and a lexer */ error = new_buffer_input_from_string( command, &input ); if ( error ) return error; error = new_lexer( input, &lexer ); if ( error ) { input->finished( input ); return error; } /* And launch the parsing! */ error = parse_command( lexer, cmd_ptr ); /* We don't need the input any more, so let's free it. */ delete_lexer( lexer ); return error; }
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); }