|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 17664 (0x4500) Types: TextFile Names: »taria2«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦e3cb726bb⟧ »test« └─⟦this⟧
integer procedure næste_symbol(tegn_værdi); integer tegn_værdi; begin integer tegn_klasse; tegn_klasse := readchar(in,tegn_værdi); næste_symbol := tegn_værdi; if test(1) then write(out,<:<10>*****T1 (næste symbol) = ':>, false add tegn_værdi,1,"'",1); end næste_symbol; real procedure næste_tal(værdi); <******************************> real værdi; begin integer tegn_værdi,tegn_klasse; real akumulation, position; akumulation := 0.0; position := 1; for tegn_klasse := readchar(in,tegn_værdi) while tegn_klasse = 2 do begin akumulation := akumulation* position + (tegn_værdi - '0'); position := position * 10; end; if tegn_klasse = 4 then begin position := 0.1; for tegn_klasse := readchar(in,tegn_værdi) while tegn_klasse = 2 do begin akumulation := akumulation + (position * (tegn_værdi - '0')); position := position * 0.1; end; end; værdi := akumulation; repeatchar(in); næste_tal := værdi; if test(1) then write(out,<:<10>*****T1: (næste_tal) = :>, <<-ddddd.ddd>,værdi); end næste_tal; long procedure næste_ord_6(navn); <********************************> long navn; begin long array text(1:20); integer antal_elementer; antal_elementer := read_string(in,text,1); næste_ord_6 := navn := text(1); while antal_elementer < 0 do antal_elementer := read_string(in,text,1); repeatchar(in); if test(1) then write(out,<:<10>****T1 (næste ord ) = :>,text); end næste_ord_6; integer procedure se_fremad(næste_art); <*************************************> integer næste_art; begin <* næste_art = 0 for ny liniee(<afleveresmikkekaf se_fremad); næste_art = 1 for tal næste_art = 2 for symbol næste_art = 3 for ord næste_art = 4 bruges ikke næste_art = 5 for end medium *> integer tegn_værdi,tegn_klasse; <* standard tegn tabel *> tegn_klasse := readchar(in,tegn_værdi); se_fremad := tegn_værdi; case tegn_klasse+1 of begin <* klasse 0 skip *> se_fremad := se_fremad(næste_art); <* illegal opfattes som 'em' *> begin næste_art := 5; end; <* klasse 2 tal *> begin næste_art := 1; repeat_char(in); end; <* klasse 3 symbol *> begin næste_art := 2; repeat_char(in); end; <* klasse 4 symbol *> begin næste_art := 2; repeat_char(in); end; <* klasse 5 symbol *> begin næste_art := 2; repeatchar(in); end; <* klasse 6 navn *> begin næste_art := 3; repeatchar(in); end; <* klasse 7 symbol *> begin if tegn_værdi = 'sp' then se_fremad := se_fremad(næste_art) else begin næste_art := 2; repeatchar(in); end; end; <* klasse 8 end medium eller skip *> begin if tegn_værdi = 'em' then begin næste_art := 5; repeat_char(in); end else se_fremad := se_fremad(næste_art); end; end alle case situationer; <* TEST *> if test(1) then write(out,<:<10>****T1: (næste art ) = :>,næste_art); end procedure sefremad; long array var_navn(1:var_max); real array var_value(1:var_max); <* variabel tabel navn,værdi,art ( art endnu ikke brugt ) var_max angiver tabellens størelse, var_top sidst indsatte variabel, var_top vil forsvinde ved en mere avanceret lagrings struktur. *> integer var_top; integer array var_art(1:var_max); procedure ny_var(navn,værdi); <***************************> value navn,værdi; long navn; real værdi; begin var_top := var_top + 1; var_navn(var_top) := navn; var_value(var_top) := værdi; end ny_var; boolean procedure find_var(navn,værdi); <*************************************> value navn; long navn; real værdi; begin boolean fundet; integer index; fundet := false; for index := 0, index+1 while index < var_top and -, fundet do fundet := if navn = var_navn(index) then true else false; find_var := fundet; if fundet then værdi := var_value(index); end find_var; boolean procedure set_var(navn,værdi); <************************************> value navn,værdi; long navn; real værdi; begin boolean fundet; integer index; fundet := false; for index := 0, index + 1 while index < vartop and -, fundet do fundet := if navn = var_navn(index+1) then true else false; set_var := fundet; if fundet then var_value(index) := værdi; end set_var; boolean procedure aritmetik(error_nr); <************************************> integer error_nr; begin integer op_top, revr_top, val_top, næste_art, func_max, op_max, operator, gl_type, ny_type, val_max, op_type, symbol, index; integer array op_stak(1:20); long array func_tab(1:6); real array val_stak(1:20),reverse_polish(1:2,1:20); long ord, assignment_ord; integer dyadisk_plus_type, monadisk_plus_type, dyadisk_minus_type, monadisk_minus_type,division_type, mult_type, power_type, sidste_før_func_type,sin_type,cos_type,tang_type,atan_type, sqrt_type, abs_type, første_monadiske_type, operator_type, værdi_type, start_niveau_type, slut_niveau_type, navne_art,symbol_art,tal_art; real grad_rad_factor,værdi; boolean fundet,slut; procedure push_operator; <***********************> begin ny_type := operator_type; if gl_type <> operator_type or op_type > sidste_før_func_type then begin for operator := pop_op_stak while (op_type <= monadisk_minus_type and operator > 0 ) or (optype = power_type and operator > mult_type ) or (optype < power_type and operator > monadisk_minus_type ) do begin make_reverse_polish; end; push_op_stak(operator); push_op_stak(op_type); if op_type <> mult_type then se_fremad(næste_art); end else error_nr := 2; end push_operator; procedure make_reverse_polish; <****************************> begin push_revr_polish(-1,pop_val_stak); if operator <> monadisk_minus_type and operator <> monadisk_plus_type and operator <= sidste_før_func_type then push_revr_polish(-1,pop_val_stak); push_revr_polish(operator,1); end make_reverse_polish; real procedure beregn; <********************> begin integer type; real værdi; type := pop_revr_polish(værdi); if type < 1 <* operator type *> then beregn := værdi else begin case type of begin <* case 1 dyadisk plus *> beregn := beregn + beregn; <* case 2 monadisk plus *> beregn := beregn; <* case 3 dyadisk minus *> beregn := beregn - beregn; <* case 4 monadisk minus *> beregn := - beregn; <* case 5 division *> beregn := beregn / beregn; <* case 6 multiplikation *> beregn := beregn * beregn; <* case 7 potensoplyftning *> beregn := beregn ** beregn; <* case 8 sinus *> beregn := sin(grad_rad_factor*beregn); <* case 9 cosinus *> beregn := cos(grad_rad_factor*beregn); <* case 10 tangens *> beregn := tan(grad_rad_factor*beregn); <* case 11 arctangens *> beregn := arctan(grad_rad_factor*beregn); <* case 12 kvadrstrod *> beregn := sqrt(beregn); <* case 13 abs *> beregn := abs(beregn); end alle case situationer; end; end beregn; integer procedure pop_op_stak; <****************************> begin pop_op_stak := op_stak(op_top); op_top := op_top - 1; if test(3) then test_print_op_stak(<:<10>^^^^**** POP::>); end pop_op_stak; procedure push_op_stak(værdi); <****************************> integer værdi; begin op_top := op_top + 1; opstak(optop) := værdi; if test(3) then test_print_op_stak(<:<10>üüüü**** PUSH::>); end push_op_stak; procedure push_val_stak(værdi); <*****************************> value værdi; real værdi; begin val_top := val_top + 1; val_stak(val_top) := værdi; if test(3) then test_print_val_stak(<:<10>üüüüü***** PUSH:>); end push_val_stak; real procedure pop_val_stak; <**************************> begin pop_val_stak := val_stak(val_top); val_top := val_top - 1; if test(3) then test_print_val_stak(<:<10>*****^^^^^ POP:>); end pop_val_stak; procedure push_revr_polish(art,værdi); <*************************************> value art,værdi; integer art; real værdi; begin revr_top := revr_top + 1; reverse_polish(1,revr_top) := art; reverse_polish(2,revr_top) := værdi; if test(2) then test_print_revr_polish_stak(<:<10>üüüüü***** PUSH::>); end push revr_polish; integer procedure pop_revr_polish(værdi); <***************************************> real værdi; begin værdi := reverse_polish(2,revr_top); pop_revr_polish := reverse_polish(1,revr_top); revr_top := revr_top - 1; if test(2) then test_print_revr_polish_stak(<:<10>*****^^^^^ POP :>); end pop_revr_polish; procedure test_print_revr_polish_stak(text); <******************************************> string text; begin integer i; write(out,text,<:<10>***T2: contents or reverse polish stak::>, <:<10>niveau værdi type:>); if revr_top > 0 then begin for i:= revr_top step -1 until 1 do write(out,<:<10>:>,<<__-dd__>,i, <<___-dddd.dd>,reverse_polish(2,i), <<____-ddd>,reverse_polish(1,i)); end else write(out,<:<10> REVERSE POLISH EMPTY:>); end test_print_revr_polish_stak; procedure test_print_op_stak(text); <**********************************> string text; begin write(out,text,<:<10>***T3: indhold af operator stak ::>, <:<10> operator :>); if op_top > 0 then begin for i := op_top step 1 until 0 do write(out,<:<10>:>,<<___-dd>,op_stak(i)); end else write(out,<:<10> EMPTY :>); end test_print_op_stak; procedure test_print_val_stak(text); <**********************************> string text; begin integer i; write(out,text,<:<10>***T3: inhold af value stak::>, <:<10>niveau værdi:>); if val_top > 0 then begin for i:= val_top step 1 until 1 do write(out,<:<10>:>,<<__-ddd>,i,<<___-ddddd.ddd>,val_stak(i)); end else write(out,<:<10> VALUE STAK EMPTY :>); end test_pritn_val_stak; boolean procedure find_assignment; <********************************> begin find_assignment := false; error_nr := 1; se_fremad(næste_art); if næste_art = symbol_art then begin næste_symbol(symbol); if symbol = ':' <* tegn værdi 58 *> then begin se_fremad(næste_art); næste_symbol(symbol); if symbol = '=' <* tegn værdi 61 *> then begin find_assignment := true; error_nr := 0; end; end; end; end find_assignment; <* initialisering *> <* initialisering af operator typer *> dyadisk_plus_type := 1; monadisk_plus_type := 2; dyadisk_minus_type := 3; power_type := 7; første_monadiske_type := 6; monadisk_minus_type := 4; division_type:= 5; mult_type := 6; sidste_før_func_type := 7; sintype := 8; cos_type := 9; tang_type := 10; atan_type := 11; sqrt_type := 12; abs_type := 13; <* initialisering af næste tegnfølges arter *> tal_art := 1; symbol_art := 2; navne_art := 3; <* initialisering af operator og operand typer *> operator_type := 1; værdi_type := 2 ; <* kan være tal eller variabel *> start_niveau_type := 3; <* start på sætning eller venstre parantes *> slut_niveau_type := 4; <* højre parantes *> func_max := 6; for index := 1 step 1 until func_max do func_tab(index) := long ( case index of (<:sin:>, <:cos:>,<:tan:>,<:atan:>,<:sqrt:>,<:abs:>)); op_max := func_max + sidste_før_func_type; grad_rad_factor := arctan(1.0)/45.0; <* init. af stak pointere *> op_top := 1; revr_top := 0; val_top := 0; opstak(1) := 0; ny_type := start_niveau_type; slut := false; <* læs venstre siden af tildelings sætningen og ind sæt navnet i tabelllen var_navn. venster siden skal have formen <variabel_navn> := <udtryk> *> error_nr := 0; se_fremad(næste_art); <* undersøg næste art *> if næste_art = navne_art and var_top + 1 <= var_max then begin næste_ord_6(assignment_ord); <* ordets første 6 tegn læses *> ny_var(assignment_ord,0.0); <* find assignment symbol *> if find_assignment then begin <* bestemmelse af næste tegn følges art *> se_fremad(næste_art); repeat gl_type := ny_type; case næste_art of begin <* i den oprindelige version tages højde for at 'næste_art' kan få værdien 0, det kan den faktisk ikke da 'nnx' læser indtil 'næste_art' <> 0. tvertimod tages ikke højde for at 'næste_art' kan få værdien 5, end medium *> begin <* case næste_art = 1 behandling af tal *> <* i den oprindelige version tages højde for at et tal kan have et foranstillet minus eller plus, det kan ikke mere forekomme, da disse alle fanges af symbol behandlingen. *> næste_tal(værdi); if gl_type <> værdi_type and gl_type <> slut_niveau_type then begin ny_type := værdi_type; push_val_stak(værdi); se_fremad(næste_art); end else error_nr := 6; end <* behandling af tal *>; begin <* case næste_art = 2 behandling af symboler *> næste_symbol(symbol); if symbol = ';' <* tegnværdi 49 *> then slut := true else if symbol = '+' <* tegnværdi 43 *> then begin op_type := if gl_type = start_niveau_type then monadisk_plus_type else dyadisk_plus_type; push_operator; end else if symbol = '-' <* tegnværdi 45 *> then begin op_type := if gl_type = start_niveau_type then monadisk_minus_type else dyadisk_minus_type; push_operator; end else if symbol = '/' <* tegnværdi 47 *> then begin op_type := division_type; push_operator; end else if symbol = '*' <* tegnværdi 42 *> then begin se_fremad(næste_art); if næste_art = symbol_art then begin næste_symbol(symbol); op_type := if symbol = '*' <* tegnværdi 42 *> then power_type else mult_type; end else op_type := mult_type; push_operator; end else if symbol = ')' <* tegnværdi 41 *> then begin if gl_type <> operator_type and gl_type <> start_niveau_type then begin ny_type := slut_niveau_type; for operator := pop_op_stak while operator > 0 do begin make_reverse_polish; end; if operator = 0 then error_nr := 3 else se_fremad(næste_art); end else error_nr := 3; end else if symbol = '(' <* tegnværdi 40 *> then begin if gl_type <> værdi_type and gl_type <> slut_niveau_type then begin ny_type := start_niveau_type; push_op_stak(-1); se_fremad(næste_art); end else error_nr := 3; end else if symbol = '&' <* tegnværdi 38 *> then begin se_fremad(næste_art); if næste_art = navne_art then begin næste_ord_6(ord); if find_var(ord,værdi) then begin if gl_type <> værdi_type and gl_type <> slut_niveau_type then begin push_val_stak(værdi); se_fremad(næste_art); end else error_nr := 6; end else error_nr := 5; end else error_nr := 5; end else error_nr := 4; <* ingen tilladte symboler *>; end <* case næste_art = 2 behandling af symboler *>; begin <* case næste_art = 3 behandling af functions navne *> næste_ord_6(ord); fundet := false; for index := 0, index + 1 while -, fundet and index < func_max do fundet := if ord = func_tab(index+1) then true else false; if fundet then begin optype := index + sidste_før_func_type; push_operator; end else error_nr := 5; end; <* case næste_art = 3 behandling af functioner *> begin <* case næste_art = 4 tom *> end; begin <* case næste_art = 5 end medium *> slut := true; error_nr := 160 <* skal rettes til noget begavet *> end; end alle case situationer; until slut or error_nr <> 0; <* udtrykket er nu på omvent polsk form og kan beregnes *> if error_nr = 0 then begin for operator := pop_op_stak while operator > 0 do begin make_reverse_polish; end; if operator = 0 then begin while val_top > 0 do push_revr_polish(-1,pop_val_stak); if test(2) then test_print_revr_polish_stak(<:<10>=========== BEREGN:>); set_var(assignment_ord,beregn); end else error_nr := 3; end; end else error_nr := 7; end else error_nr := 1; <* no variable *> end aritmetik; ▶EOF◀