Sei sulla pagina 1di 10

DOCUMENTACIN TIGCC

By TIGCC Team
Fragmentos de la documentacin oficial de TIGCC
Traducido por Luis A. Torres Figueroa (Phygraff)
Lo siguiente contiene la descripcin de ciertas funciones del TIGCC relacionadas con la ejecucin de operadores de TI-Basic. Esta es slo una traduccin parcial e nfima comparada con la vastedad de funciones, macros, variables, etc. que puede encontrar en la versin en ingls, para mayor informacin remtase a la documentacin oficial contenida en el help del compilador o a la pgina web http://tigcc.ticalc.org.

push_parse_text
AMS 1.01 o superior
short push_parse_text (const char *str);

Funcin (ROM Call 0x3CA) estack.h

Analiza una expresin dada en una cadena y presiona expresin mostrada a la expresin apilada.
push_parse_text es una funcin extremadamente poderosa: analiza la expresin dada en la cadena str y presiona la expresin (en la forma RPN) a la expresin apilada. Esta funcin tambin puede analizar declaraciones de TI-Basic (analizando despus, la forma tokenized de estas declaraciones es presionada en la expresin apilada tambin). push_parse_text devuelve FALSE si la expresin es una expresin mltiple (es decir, si esta contiene : [separador], -> [guardar] o declaraciones TI-Basic), de lo contrario devuelve TRUE. Esta rutina puede causar la expansin de la expresin apilada o demasiada compresin. TIGCCLIB internamente usa esta funcin (junto con estack_number_to_Float) en la implementacin de la funcin atof. Para ms ejemplos de uso de esta funcin, vea NG_approxESI, NG_rationalESI, NG_execute, etc. La funcin inversa de push_parse_text es diaplay_statements. Si usted quiere realizar operaciones simblicas altamente avanzadas con expresiones, debe saber que las expresiones creadas por push_parse_text no siempre estn organizadas en una manera que permita el proceso simblico ms eficiente (mal llamado forma cannica interna). Por ejemplo, TIOS siempre convierte x*3 en 3*x y convierte x-y en x+y*(-1), aunque lo imprima como x-y. Sin embargo, las expresiones creadas por push_parse_text son siempre como son, es decir 3*x ser slo 3*x, no x*3. Algunas rutinas (como numeric_factor_index por ejemplo) pueden ser engaadas si la expresin no es ordenada correctamente. Tambin, algunas rutinas (como lead_term_index, lead_factor_index, etc.) pueden ser engaadas con expresiones como x-y y x/y, porque los operadores - y / generalmente nunca se ven en expresiones durante el proceso simblico (el proceso es ms nico si la adicin y la sustraccin se tratan como la misma operacin, lo mismo es cierto para * y /) Entonces, si usted plane realizar cierto proceso simblico avanzado que se basa en tener acceso a varias partes de la expresin, siempre llame a push_internal_simplify despus de llamar a push_parse_text. Esta funcin presiona sobre la expresin apilada la misma expresin pero convertida en la forma cannica interna. Nota: push_parse_text lanzar un error si la cadena contiene una expresin con sintaxis incorrecta, entonces usted necesita usar TRY etc. para coger eventuales errores. Y, la cadena se debe construir usando convenciones del TI-Basic (por ejemplo, usted debe utilizar 0xAD (menos pequeo) en vez de - para menos unario, etc. Vea NG_tokenize para una funcin ms poderosa que no expulse ningn error, y que pueda determinar la localizacin y el tipo de error exacto.

Usos: are_expressions_identical, check_estack_size, delete_between, delete_expression, is_valid_smap_aggregate, map_tail, move_between_to_top, next_expression_index, push_between, push_expression, push_Float, push_quantum, push_quantum_pair, push_reversed_tail, top_estack, ER_catch, ER_success, ER_throwVar, OSCheckBreak, CTypeTable, fix_loop_displacements, is_pathname, next_token, nonblank, primary_tag_list, push_ans_entry, push_var, CheckReservedName, DerefSym, FindSymInFolder, TempFolderName, ROM Call 0x4D4, ROM Call 0x5C5, ROM Call 0x5EF, ROM Call 0x5F0 Usado por: NG_tokenize, TokenizeSymName, push_str_to_expr, handleVarLinkKey, HomeExecute, atof, FolderDel, FolderRename, HSymDel, SymFindFolderName, ROM Call 0x46F, ROM Call 0x5F1

top_estack

Variable (ROM Call 0x109) args.h, estack.h

ESI top_estack;

Puntos a la cima de pila de expresin. (expression stack) La variable global top_estack points a la cima (es decir, el ltimo bye) de la pila de expresin (expression stack). Estrictamente hablando, en modo nostub esta no es una variable real pero un macro rpido, aunque trabaja como si fuera una variable. La pila de expresin es el lugar en la memoria donde TI guarda las expresiones durante la evaluacin. Todas las declaraciones son tokenizadas antes de ser ejecutadas (interpreradas). Las instrucciones se reducen a (tamao en byte) cunticas y se analizan en la Notacin Polaca Inversa (RPN). Esta es una tcnica comn en lenguajes interpretados. Expresiones, funciones, etc. Son todos guardados en la forma RPN, para permitir la operacin eficiente de la pila de expresin. Vea abajo para ms detalles sobre la organizacin de la pila de expresin. El procesamiento actual de todas las expresiones es hecho va la pila de expresin. La posicin en la pila es dada por top_estack. Empujando un valor lo aade al final al final del fichero de la pila de expresin y top_estack es incrementada. Cuando se interpreta una expresin, las expresiones son reducidas, y ejecutadas lo mximo posible. Lo que queda orientado en la pila es el resultado, entonces este puede ser guardado o procesado despus. Cuando un archivo es interpretado el fin de la variable es encontrado y es procesado como una pila de expresin separada. Entonces de procesa recursivamente, produciendo una versin simplificada sobre la original pila de expresin. Las expresiones por lo tanto se interpretan desde la cima (memoria alta) recursivamente. Como un artefacto de mecanismos que procesan expresiones, el argumento del programa llamado se guarda tambin en la pila de expresin. Crece hacia arriba, y el ltimo argumento es guardado primero. Despus el programa assembly es llamado, la imagen de la pila de expresin es como sigue: El primer byte (es decir, el byte con la direccin ms baja) en la pila es END_TAG (0xE5). Entonces, sigue la lista de argumentos, a partir del ltimo argumento hasta el primero. Entonces, top_estack seala al ltimo byte del primer argumento. Cada cadena ingresada en la pila de expresin es guardada como sigue (de menores a mayores direcciones): Un byte cero (comenzando el tag); Contenido de la cadena;

Byte cero final (terminator); El byte STR_TAF (0x2D). Cada entero ingresado es guardado como sigue: Bytes del numero en formato little endian (es decir, el byte ms bajo es guardado primero); el nmero de bytes vara dependiendo del tamao del nmero; Un byte que representa el nmero de bytes que hicieron el nmero (note que creo tiene una longitud de cero byte); Byte POSINT_TAG (0x1F) o NEGINT_TAG (0x20), dependiendo si el nmero es positivo o negativo (para nmeros negativos, los bytes anteriores contienen el valor absoluto). Cada fraccin ingresada es guardada como sigue: Los bytes del denominador en formato little endian (es decir, el byte ms bajo es guardado primero); el nmero de bytes vara dependiendo del tamao del nmero; Un byte que representa el nmero de bytes que hacen al denominador; Los bytes del numerador en formato little endian; Un byte que representa el nmero de bytes que hacen al numerador; El byte POSFRAC_TAG (0x21) o NEGFRAC_TAG (0x22), dependiendo si la fraccin es positiva o negativa (para las fracciones negativas, los bytes anteriores contienen valores absolutos). Cada coma flotante ingresada es guardada como sigue: Slo los primeros 9 bytes del contenido del valor en coma flotante es guardado (en vez de 10), porque TIOS siempre redondea valores en coma flotante superiores a 14 dgitos significativos antes de empujarlos en la pila de expresin (vea la estructura bcd para ms informacin acerca de la organizacin interna de un valor en coma flotante); El ltimo byte es FLOAT_TAG (0x23). Si es ingresado un nmero complejo, la parte real es guardada primero (que puede ser entera, flotante, fraccin, etc.), despus la parte imaginaria. COMPLEX_TAG (0x9D) es guardada despus de ellos, entonces si el tipo de argumento actual es complejo, disminuye el puntero al argumento en uno, entonces primero es leda la parte imaginaria, luego la parte real separadamente. Si la entrada es compuesta (es decir, si es una lista o una matriz), el primer byte es el marcador end_of_list (byte END_TAG o 0xE5), luego sigue cada elemento de la lista en orden reverso (a partir del ltimo elemento), y el ltimo byte es LIST_TAG (0xD9). Ahora, seguramente tienes una idea de cmo poder tomar elementos de la lista. Observa que una matriz es una lista de listas. Ceros con signo (POSITIVE_ZERO y NEGATIVE_ZERO) son representados como las fracciones +0/1 y -0/1.

Nombres de variables son guardados exactamente como cadenas sin la terminacin STR_TAG (es decir, son una secuencia de letras limitadas con dos bytes cero), entonces el tag variable es slo un byte cero. Esta es una excepcin: variables de una letra tienen nicamente tags one-byte (vea Tags para ms informacin). Tambin, observe que los nombres de variables son siempre guardados con letras minsculas. Las variables cuyos nombres terminan con un underscore (_) son asumidas como si fueran complejas, y las variables cuyos nombres comiencen con un underscore (_) se asumen para representar unidades fsicas. Las expresiones son guardadas en forma RPN (Reverse Polish Notation) (tambin conocida como forma sufijo). Entonces, una funcin llamada como func(arg1, arg2, argn) es guardada como la secuencia argn arg2 arg1 func_tag y los trminos como arg1 operador arg2 son guardadas como arg1 arg2 operador_tag o arg2 arg1 operador_tag, dependiendo de un operador en concreto. La situacin es anloga para operadores unarios. Observe que un puntero a una expresin es un puntero al ltimo byte de la expresin! Cuando una funcin (o operador) tiene un nmero variable de argumentos, END_TAG es usado para indicar que no hay ms argumentos. Vea Tags por una completa lista de varios tags. Esto ser ilustrado con algunos ejemplos: Forma algebraica: Forma RPN: Secuencia de bytes: Forma algebraica: Forma RPN: Secuencia de bytes: Forma algebraica: Forma RPN: Secuencia de bytes: integrate (e^(x^2), x, 1, 2) 2 1 x 2 x ^ e ^ integrate [02 01 1F] [01 01 1F] [08] [02 01 1F] [08] [93] [25] [93] [C4] sum (sqrt (1 + x), x, 0, a) a 0 x x 1 sqrt sum [0B] [00 1F] [08] [08] [01 01 1F] [8B] [51] a + b + a - b + (a + b) * (a - b) -> a a b + a + b - a b + a b - * + a -> [0B] [0C] [8B] [0B] [8B] [0C] [8D] [0B] [0C] [8B] [0B] [0C] [8D] [8F] [8B] [0B] [80] {{1, 2}, {3, 4}} END_TAG END_TAG 4 3 LIST_TAG END_TAG 2 1 LIST_TAG LIST_TAG [E5] [E5] [04 01 1F] [03 01 1F] [D9] [E5] [02 01 1F] [01 01 1F] [D9] [D9] my_func (a, b, c) END_TAG c b a my_func USERFUNC_TAG

Forma algebraica: Forma RPN: Secuencia de bytes: Forma algebraica: Forma RPN:

Secuencia de bytes:

[E5] [0D] [0C] [0B] [00 6D 79 5F 66 75 6E 63 00] [DA]

Para realizar algunas transformaciones algebraicas en una manera ms nica, las expresiones se deben transformar en una forma equivalente llamada forma cannica interna (internal canonic form). En tal forma, por ejemplo, todas las constantes estn siempre delante de las variables, por ejemplo x*3 y x+3 se convierte en 3*x y 3+x (aunque el segundo ejemplo ser impreso como x+3). Tambin, expresiones como x/y o x-y en forma cannica interna no contienen sustracciones ni divisiones. Como el parmetro de la lista (cuando el programa es llamado desde TI-Basic) est siempre en la forma cannica interna, tales expresiones nunca sern observadas como-son en el parmetro de la lista etc. Porque son convertidas antes de pasarlas al programa. Un grupo de funciones para manipulaciones algebraicas convierten automticamente la expresin en la forma cannica interna, pero cuando esto no es cierto, siempre puedes forzar la conversin usando la llamada explicita a la funcin push_internal_simplify. Note que la conversin inversa (es decir regresar de la forma cannica inversa a la forma regular) es realizada en cualquier momento cuando intente imprimir la expresin hacia afuera. Aqu esta la lista de las transformaciones ms comunes que aparecen durante la transformacin a la forma cannica inversa: Espresin -x x-y x/y e^x x^y e sqrt(x) log(x) sin(x) Forma estndar cannica (-1)*x x+y*(-1) x*y^(-1) exp(x) expr(ln(x)*y) [excepto cuando y es un entero o una fraccin] exp(1) x^(1/2) ln(x)*(ln(10)^(-1)) trig(x,0) [asumiendo modo radin; para la funcin trig; vea SINCOS_TAG] trig(x,1) trig(x,0)*trig(x,1)^(-1) exp(x)*(1/2)+exp(x)^(-1)*(-1/2) exp(x)*(1/2)+exp(x)^(-1)*(1/2) (exp(x)^2+1)^(-1)*(exp(x)^2+(-1)) (not x and y) or (x and not y)

cos(x) tan(x) sinh(x) cosh(x) tanh(x) x xor y

El modo dependiente de calculus es realizada convirtiendo expresiones a un formato especfico, es decir para funciones trigonomtricas todos los valores son convertidos a radianes antes de pasarlos a las funciones trigonomtricas en radianes.

Una variable puede consistir de mltiples expresiones, stas estn separadas por varios quanta especial: NEXTEXPR_TAG y YNEWLINE_TAG. La ltima expresin es marcada con ENDSTACK_TAG. Vea MULTI_EXPR. Si todo lo mencionado arriba no es tan claro para usted, compile y ejecute el siguiente ejemplo (llamado Print EStack):
// Print bottom_estack and top_estack #define USE_TI89 #define USE_TI92PLUS #define USE_V200 #define MIN_AMS 100 #define SAVE_SCREEN #include <tigcclib.h> // Compile for TI-89 // Compile for TI-92 Plus // Compile for V200 // Compile for AMS 1.00 or higher // Save/Restore LCD Contents // Include All Header Files

// Main Function void _main(void) { ClrScr (); printf_xy (0, 40, "Bottom = 0x%lp", bottom_estack); printf_xy (0, 50, "Top = 0x%lp", top_estack); ngetchx (); }

Ejecute este programa en VTI y psele los parmetros que desee. top_estack ser mostrado en la pantalla. Durante la espera por presionar una tecla, ingrese el debugger y vea las direcciones mostradas, para ver como los parmetros son guardados.

Usado por: can_be_approxed, check_estack_size, compare_complex_magnitudes, delete_between, deleted_between, did_push_cnvrt_Float_to_integer, index_below_display_expression_aux, is_antisymmetric, is_symmetric, map_tail, map_tail_Int, next_expression_index, NG_graphESI, Parse2DExpr, Parse2DMultiExpr, push_between, push_expr_quantum, push_expr2_quantum, push_Float, push_Float_to_nonneg_int, push_Float_to_rat, push_internal_simplify, push_offset_array, push_parse_text, push_quantum, push_quantum_pair, push_round_Float, push_transpose_aux, push_ushort_to_integer, reset_estack_size, should_and_did_push_approx_arg2, TokenizeSymName, HeapAllocESTACK, ArgCount, EX_getArg, InitArgPtr, cmd_blddata, cmd_circle, cmd_custom, cmd_dialog, cmd_disp, cmd_drawfunc, cmd_drawinv, cmd_drawparm, cmd_drawpol, cmd_endfor, cmd_endwhile, cmd_fill, cmd_for, cmd_get, cmd_if, cmd_ifthen, cmd_input, cmd_inputstr, cmd_linetan, cmd_local, cmd_newdata, cmd_newplot, cmd_output, cmd_passerr, cmd_pause, cmd_popup, cmd_prompt, cmd_randseed, cmd_request, cmd_shade, cmd_sinreg, cmd_slpline, cmd_sorta, cmd_sortd, cmd_toolbar, cmd_try, cmd_while, did_push_anti_deriv, did_push_series, push_1st_derivative, push_abs, push_acos, push_acosh, push_asin, push_asinh, push_atan, push_atanh, push_ceiling,

push_coldim, push_colnorm, push_comb, push_comdenom, push_conj, push_cosh, push_cross_product, push_csolve, push_cumsum, push_czeros, push_def_int, push_denominator, push_desolve, push_determinant, push_diag, push_dimension, push_dotproduct, push_eigvc, push_eigvl, push_exp, push_expand, push_extended_prod, push_factor, push_floor, push_fractional_part, push_gcd_numbers, push_im, push_integer_lcm, push_integer_part, push_integer_quotient, push_integer_remainder, push_is_prime, push_left, push_lim, push_list_to_mat, push_ln, push_log10, push_matnorm, push_max, push_max1, push_max2, push_mean, push_median, push_mid, push_min, push_min1, push_min2, push_mod, push_mrowadd, push_nint, push_nsolve, push_nth_derivative, push_numerator, push_part, push_perm, push_phase, push_pttest, push_pxltest, push_r_cis, push_rand, push_randmat, push_randnorm, push_randpoly, push_re, push_rec_to_angle, push_red_row_ech, push_right, push_rotate, push_round, push_row_echelon, push_rowadd, push_rowdim, push_rownorm, push_rowswap, push_sequence, push_shift, push_sign, push_simult, push_sin2, push_sinh, push_solve, push_stddev, push_str_to_expr, push_string, push_submat, push_summation, push_switch, push_tan, push_tanh, push_unitv, push_variance, push_when, push_zeros, did_push_to_polar, push_and, push_assignment, push_degrees, push_dot_exponentiate, push_equals, push_exponentiate, push_factorial, push_greater_than, push_greater_than_or_equals, push_indir_name, push_less_than, push_less_than_or_equals, push_list_plus, push_list_times, push_matrix_product, push_negate, push_not, push_not_equals, push_or, push_product, push_radians, push_ratio, push_substitute_no_simplify, push_substitute_simplify, push_substitute_using_such_that, push_sum, push_to_cylin, push_to_sphere, VarNew, VarOpen, VarSaveAs, EV_defaultHandler, handleRclKey, handleVarLinkKey, GR3_paint3d, GR3_xyToWindow, HomeExecute, HomePushEStack, HS_popEStack, getcalc, OSLinkCmd, sendcalc, atof, add_to_top, and_onto_top, are_units_consistent, compare_numbers, cpt_gr_fun, cpt_gr_param, cpt_gr_polar, de_initRes, de_loop, did_map_aggregate_arg, did_push_approx_inflection_point, did_push_divide_units, did_push_lincf, divide_top, dv_create_graph_titles, EQU_getNameInfo, ForceFloat, get_lb, get_list_indices, get_matrix_indices, get_ub, GetStatValue, GM_Derivative, GM_DistArc, GM_Inflection, GM_Integrate, GM_Intersect, GM_Math1, GM_TanLine, gr_ck_solvergraph, gr_execute_de, gr_execute_seq, GR_Pan, GR3_addContours, GraphOrTableCmd, GT_CalcDepVals, GT_PrintCursor, has_different_variable, index_if_pushed_binomial_info, index_if_pushed_qquad_info, InitDEMem, InitTimeSeq, is_equivalent_to, is_negative, is_never0, is_nonnegative, is_nonpositive, is_positive, is_real, is_term_improper, or_onto_top, push_auto_units_conversion, push_but_factor, push_but_term, push_constant_factors, push_constant_terms, push_dependent_factors, push_dependent_terms, push_div_dif_1c, push_div_dif_1f, push_float_qr_fact, push_format, push_gcd_then_cofactors, push_independent_factors, push_independent_terms, push_lu_fact, push_make_proper, push_minus_recip_of_quantum, push_mrow_aux, push_negate_quantum_as_negint, push_nonconstant_factors, push_nonconstant_terms, push_nonnumeric_factors, push_parse_prgm_or_func_text, push_pi_on_quantum, push_poly_deg_in_var_or_kernel, push_poly_qr, push_quantum_as_nonnegative_int, push_quantum_pair_as_pos_frac, push_reciprocal, push_reciprocal_of_quantum, push_simplify, push_simplify_statements, push_sq_matrix_to_whole_number, push_standardize, push_symbolic_qr_fact, push_trig, push_user_func, push_var, push_zero_partial_column, raise_to_top, Regraph,

replace_top_with_post_simplified, replace_top_with_reciprocal, replace_top2_with_and, replace_top2_with_imre, replace_top2_with_or, replace_top2_with_pow, replace_top2_with_prod, replace_top2_with_ratio, replace_top2_with_sum, run_one_seq, seqWebInit, setup_unit_system, SP_Define, spike_geo_titles, spike_in_editor, spike_optionD, spike_titles_in_editor, store_func_def, store_to_subscripted_element, subtract_from_top, time_loop, times_top, tokenize_if_TI_92_or_text, TokenizeName, VarStoreLink, FolderDel, FolderRename, HSymDel, SymFindFolderName, VarRecall, ROM Call 0x45B, ROM Call 0x468, ROM Call 0x46F, ROM Call 0x47F, ROM Call 0x480, ROM Call 0x484, ROM Call 0x485, ROM Call 0x48D, ROM Call 0x494, ROM Call 0x495, ROM Call 0x4C2, ROM Call 0x4C6, ROM Call 0x4C7, ROM Call 0x4D1, ROM Call 0x4E6, ROM Call 0x4EC, ROM Call 0x4ED, ROM Call 0x4F2, ROM Call 0x5F1, ROM Call 0x606

Vea tambin: bottom_estack

Potrebbero piacerti anche