/*! Create a new SyxParser to parse the code later. \param method a CompiledMethod or CompiledBlock \param instance_names list of instance variable names */ SyxParser * syx_parser_new (SyxLexer *lexer, SyxOop method, SyxOop klass) { SyxParser *self; if (!lexer || !SYX_IS_OBJECT (method)) return NULL; self = (SyxParser *) syx_malloc (sizeof (SyxParser)); self->lexer = lexer; self->method = method; self->klass = klass; self->_in_block = FALSE; self->bytecode = syx_bytecode_new (); self->_temporary_names_top = 0; self->_argument_names_top = 0; self->instance_names = syx_class_get_all_instance_variable_names (klass); self->_duplicate_indexes_top = 0; self->_argument_scopes.top = 0; self->_temporary_scopes.top = 0; return self; }
/*! Parse a declaration file. \return TRUE if no error has occurred */ syx_bool syx_cold_file_in (syx_symbol filename) { SyxLexer *lexer; syx_string buffer; syx_int32 fd, count; syx_size size; #ifdef HAVE_FSTAT struct stat statbuf; #endif if ((fd = open (filename, O_RDONLY)) < 0) { syx_error ("can't open %s\n", filename); return FALSE; } #ifdef HAVE_FSTAT if ((fstat (fd, &statbuf)) < 0) { syx_error ("can't obtain size of %s\n", filename); return FALSE; } size = statbuf.st_size; #else size = 1000000; #endif buffer = (syx_string) syx_malloc (size + 1); count = read (fd, buffer, size); buffer[count - 1] = '\0'; close (fd); lexer = syx_lexer_new (buffer); if (!lexer) { syx_free (buffer); return FALSE; } if (!syx_cold_parse (lexer)) { syx_lexer_free (lexer, TRUE); return FALSE; } syx_lexer_free (lexer, TRUE); return TRUE; }