/media/bill/PROJECTS/Qnial/code develop_test/z_180903 symTranslate, conversion to str_stdForm and typechanges within strings.txt *********************************************** *********************************************** 12Sep2018 08:31 MAJOR CHANGE!!! - Write a separate system to "align-format" derivations!!! Abandon tracking of [symbol, expression] positions - translations work in str_stdForm I still need typeList Huge difference : - enormously simplify sym[Extract, Translate] - highly useful for non-aligned derivations and adhoc work day-by-day Just do a file-based approach Hopefully independent of symbol system -> don't have to "recognized" [symbols, expressions] 12Sep2018 14:16 After getting symExtract_string to work and test 100% : symTranslate_alltest >> results : All OK symExpr_sub_test All OK xprs_ExtractTranslate_test All fail symTrans_test t_result = ?op_parameter All fail symTranslate_string_test t_result = ?op_parameter Big change with processing means : # 03Sep2018 sym[Extract,Translate]_file format : # debug mode - MUST use file pname_inn that has already been processed by sym_stdForm_file!! # normal mode - uses original format of file # flag_debug indicates where (or not) pname_inn is in standard format # -> 12Sep2018 - NO to all above! now ops expect str_stdForm. /[*,%,$] don't have to be at start of line # should process debug fine! get rid of : flag_stdForm change str to str_stdForm # symTranslate_string IS OP str_stdForm - prepares a string and a sed expression # for translate_sed using a dictionary, so all dictionary subs are done # 09Apr2018 in the future I need to specify translation "dictionaries"! (not just use default names!) # 02May2018 keep [spaces,tabs] outside of symbols, standard form within # 02May2018 for now find_HOWELL searches entire trans_old, but I should use an efficient search! # if str_stdForm starts with `$, then it is NOT translated, and the original string is returned # don't spend time on [expr,sym] locations initially, as the str_stdForm is continually changing! # 05May2018 symList_raw components may change to a standard format, but for now expressions don't have a standard form ; # 05May2018 lines with no [syms,xprs] - errors and waste of time # 03Sep2018 sym[Extract,Translate]_file format : # debug mode - MUST use file pname_inn that has already been processed by sym_stdForm_file!! # normal mode - uses original format of file # flag_debug indicates where (or not) pname_inn is in standard format # -> 12Sep2018 - NO to all above! now ops expect str_stdForm. /[*,%,$] don't have to be at start of line # should process debug fine! # 06Jul2018 general instructions for symbol [extract,translate] see : "/media/bill/PROJECTS/Lucas - Universal Force/3 Instructions - symbols extractions and translations.txt" # Change : +-----+ symTranslate_string IS OP flag_stdForm str { LOCAL address i lengths mixList mixList_cull textnew xprList_inn symList_inn symList_inn_chg allList_inn allList_inn_grade allList_inn_cull xprList_trn symList_trn symList_trn_chg allList_trn allList_trn_grade allList_trn_cull ; NONLOCAL chrs_symbols_HFLN ; % ; textnew := str ; IF flag_stdForm THEN symList_inn typeList posnList := symExtract_stringPosn str ; ELSE symList_inn typeList posnList := symExtract_stringPosn sym_stdForm str ; ENDIF ; % ; xprList_inn xprList_trn posnList := str ; symList_trn := EACH symTrans (EACHBOTH pair symList_inn typeList) ; % ; %pick out only the symbols that change from raw to trn!! ; symList_inn_chg symList_trn_chg := (EACHBOTH ~= symList_inn symList_trn ) EACHRIGHT sublist (symList_inn symList_trn ) ; % ; % combine syms and xprs into "allLists" ; allList_inn := link symList_inn_chg xprList_inn ; allList_trn := link symList_trn_chg xprList_trn ; % ; %sort the two lists [raw,trn]. This is to force replacement of the largest [syms,exprs] first, so the simple "atomic" syms don't prevent larger coherent translations ; % sort by decreasing length of allList_inn - BOTH [allList_inn,allList_trn] must be the same shape to cull a pair. ; lengths := EACH (gage shape) allList_inn ; address := grade >= lengths ; %write '[lengths,address]= ' lengths address ; allList_inn_grade allList_trn_grade := address EACHRIGHT choose allList_inn allList_trn ; %EACH write '[allList_inn_grade,allList_trn_grade]= ' allList_inn_grade allList_trn_grade ; % ; %cull the two lists [raw,trn] ; mixList := allList_inn_grade EACHBOTH pair allList_trn_grade ; mixList_cull := cull mixList ; allList_inn_cull allList_trn_cull := [EACH first, EACH second] mixList ; % ; %EACH write '[str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull]= ' str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull ; % symTranslate_alltest ; %replace allList_inn_cull with allList_trn_cull one at at a time, as textnew changes with each substitution ; %multiple instances of a allList_inn_cull are replaced. ; %write link 'raw str_stdForm= ' str_stdForm ; FOR i WITH tell gage shape allList_inn_cull DO textnew := symExpr_sub allList_inn_cull@i allList_trn_cull@i textnew ; %write allList_inn_cull@i allList_trn_cull@i ; %write link (string i) ' : ' textnew ; ENDFOR ; % ; textnew } +-----+ To : +-----+ symTranslate_string IS OP str_stdForm { LOCAL address i lengths mixList mixList_cull textnew xprList_inn symList_inn symList_inn_chg allList_inn allList_inn_grade allList_inn_cull xprList_trn symList_trn symList_trn_chg allList_trn allList_trn_grade allList_trn_cull ; NONLOCAL chrs_symbols_HFLN ; % ; textnew := str_stdForm ; xprList_inn xprList_trn := str_stdForm ; symList_trn := EACH symTrans (EACHBOTH pair symList_inn typeList) ; % ; %pick out only the symbols that change from raw to trn!! ; symList_inn_chg symList_trn_chg := (EACHBOTH ~= symList_inn symList_trn ) EACHRIGHT sublist (symList_inn symList_trn ) ; % ; % combine syms and xprs into "allLists" ; allList_inn := link symList_inn_chg xprList_inn ; allList_trn := link symList_trn_chg xprList_trn ; % ; %sort the two lists [raw,trn]. This is to force replacement of the largest [syms,exprs] first, so the simple "atomic" syms don't prevent larger coherent translations ; % sort by decreasing length of allList_inn - BOTH [allList_inn,allList_trn] must be the same shape to cull a pair. ; lengths := EACH (gage shape) allList_inn ; address := grade >= lengths ; %write '[lengths,address]= ' lengths address ; allList_inn_grade allList_trn_grade := address EACHRIGHT choose allList_inn allList_trn ; %EACH write '[allList_inn_grade,allList_trn_grade]= ' allList_inn_grade allList_trn_grade ; % ; %cull the two lists [raw,trn] ; mixList := allList_inn_grade EACHBOTH pair allList_trn_grade ; mixList_cull := cull mixList ; allList_inn_cull allList_trn_cull := [EACH first, EACH second] mixList ; % ; %EACH write '[str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull]= ' str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull ; % ; %replace allList_inn_cull with allList_trn_cull one at at a time, as textnew changes with each substitution ; %multiple instances of a allList_inn_cull are replaced. ; %write link 'raw str_stdForm= ' str_stdForm ; FOR i WITH tell gage shape allList_inn_cull DO textnew := symExpr_sub allList_inn_cull@i allList_trn_cull@i textnew ; %write allList_inn_cull@i allList_trn_cull@i ; %write link (string i) ' : ' textnew ; ENDFOR ; % ; textnew } +-----+ # symTranslate_file IS OP flag_debug f_derivations - [extraction,translation] of [syms,exprs] in Lucas f_derivation file # www.BillHowell.ca 14Apr2018 initial, 06Jul2018 moved to "symbols translate.ndf" # 03Sep2018 sym[Extract,Translate]_file format : # debug mode - MUST use file pname_inn that has already been processed by sym_stdForm_file!! # normal mode - uses original format of file # flag_debug indicates where (or not) pname_inn is in standard format # -> 12Sep2018 - NO to all above! now ops expect str_stdForm. /[*,%,$] don't have to be at start of line # should process debug fine! Change : +-----+ symTranslate_file IS OP flag_debug pname_stdForm_inn d_out { LOCAL d_out fin fot i fname_base fname_extension line_in p_log_test pname_out str ; NONLOCAL d_Lucas d_QNial_mine d_QNial_temp p_log_test_fNum ; % ; p_log_test := link d_QNial_mine 'symbols log.txt' ; IF (p_log_test = 'stdout') THEN p_log_test_fNum := 1 ; ELSE p_log_test_fNum := open p_log_test "a ; ENDIF ; dinn finn_base finn_extension := filepath_pathBaseExtn pname_stdForm_inn ; pname_out := link d_out finn_base ' trans.' finn_extension ; % ; EACH write_testStr ' ' '+---------------+' (link 'symTranslate_file, ' timestamp_YYMMDD_HMS) ; write_testStr 'uses symTranslate_string, which translates symbols and expressions' ; write_testStr link 'pname_stdForm_inn= ' pname_stdForm_inn ; write_testStr link 'pname_out= ' pname_out ; % ; i := 0 ; fin := open pname_stdForm_inn "r ; fot := open pname_out "w ; WHILE ( ~= ??eof (str := readfile fin)) DO line_in := symTranslate_string flag_debug str ; writefile fot line_in ; i := i + 1 ; ENDWHILE ; EACH close fin fot ; % ; symExtract_file pname_out d_out ; % ; write_testStr timestamp ; IF (p_log_test_fNum ~= 1)12Sep2018 14:16 After getting symExtract_string to work and test 100% : symTranslate_alltest >> results : All OK symExpr_sub_test All OK xprs_ExtractTranslate_test All fail symTrans_test t_result = ?op_parameter All fail symTranslate_string_test t_result = ?op_parameter THEN close p_log_test_fNum ; ENDIF ; p_log_test_fNum := 1 ; } +-----+ To : +-----+ symTranslate_file IS OP pname_stdForm_inn d_out { LOCAL d_out fin fot i fnasymTranslate_alltest me_base fname_extension line_in p_log_test pname_out str ; NONLOCAL d_Lucas d_QNial_mine d_QNial_temp p_log_test_fNum ; % ; p_log_test := link d_QNial_mine 'symbols log.txt' ; IF (p_log_test = 'stdout') THEN p_log_test_fNum := 1 ; ELSE p_log_test_fNum := open p_log_test "a ; ENDIF ; dinn finn_base finn_extension := filepath_pathBaseExtn pname_stdForm_inn ; pname_out := link d_out finn_base ' trans.' finn_extension ; % ; EACH write_testStr ' ' '+---------------+' (link 'symTranslate_file, ' timestamp_YYMMDD_HMS) ; write_testStr 'uses symTranslate_string, which translates symbols and expressions' ; write_testStr link 'pname_stdForm_inn= ' pname_stdForm_inn ; write_testStr link 'pname_out= ' pname_out ; % ; i := 0 ; fin := open pname_stdForm_inn "r ; fot := open pname_out "w ; WHILE ( ~= ??eof (str := readfile fin)) DO line_in := symTranslate_string sym_stdForm str ; writefile fot line_in ; i := i + 1 ; ENDWHILE ; EACH close fin fot ; % ; symExtract_file pname_out d_out ; % ; write_testStr timestamp ; IF (p_log_test_fNum ~= 1) THEN close p_log_test_fNum ; ENDIF ; p_log_test_fNum := 1 ; } +-----+ # symDebug_file IS OP pname_inn symTranslate_alltest d_out - generate output of [sym_stdForm, symExtract, symTranslate] to help fix code # www.BillHowell.ca 01Sep2018 initial # outputs are NOT used to replace permanent files - they are in d_QNial_temp # 12Sep2018 - now all this does is put line numbers at the start of each line of input file, and save to d_QNial_temp Change : +-----+ symDebug_file IS OP pname_inn d_out { LOCAL d_inn fname_base fname_extension line_in p_log_test pname_out str ; NONLOCAL d_QNial_temp ; dinn finn_base finn_extension := filepath_pathBaseExtn pname_inn ; pname_out := link d_out finn_base ' stdForm.' finn_extension ; sym_stdForm_file pname_inn d_out ; symTranslate_file l pname_out d_out ; } +-----+ To : +-----+ symDebug_file IS OP pname_inn d_out { LOCAL d_inn fname_base fname_extension line_in p_log_test pname_out str ; NONLOCAL d_QNial_temp ; dinn finn_base finn_extension := filepath_pathBaseExtn pname_inn ; pname_num := link d_out finn_base ' numbInn.' finn_extension ; pname_out := link d_out finn_base ' stdForm.' finn_extension ; %bash code to output line-numbered copy of pname_inn into d_QNial_temp ; sym_stdForm_file pname_num d_out ; symTranslate_file l pname_out d_out ; } +-----+ Go back to symTranslate_alltest : >> results : All OK symExpr_sub_test All OK xprs_ExtractTranslate_test All fail symTrans_test t_result = ?op_parameter All fail symTranslate_string_test t_result = ?op_parameter symTranslate_alltest >> oops, more editing ... Change : +-----+ previous version +-----+ To : +-----+ symTranslate_stringType IS OP str_stdForm { LOCAL address i lengths mixList mixList_cull textnew xprList_inn symList_inn symList_inn_chg allList_inn allList_inn_grade allList_inn_cull xprList_trn symList_trn symList_trn_chg allList_trn allList_trn_grade allList_trn_cull ; NONLOCAL symTrans_lineType ; % ; textnew := null ; % ; IF (~= '/*' symTrans_lineType) THEN % ; textnew := str_stdForm ; % symList includes BOTH [symbols, expressions] ; symList_inn := symExtract_string str_stdForm ; symList_trn := symTrans symList_inn ; % ; %pick out only the symbols that change from raw to trn!! ; symList_inn_chg symList_trn_chg := (EACHBOTH ~= symList_inn symList_trn ) EACHRIGHT sublist (symList_inn symList_trn ) ; % ; % combine syms and xprs into "allLists" ; allList_inn := link symList_inn_chg xprList_inn ; allList_trn := link symList_trn_chg xprList_trn ; % ; %sort the two lists [raw,trn]. This is to force replacement of the largest [syms,exprs] first, so the simple "atomic" syms don't prevent larger coherent translations ; % sort by decreasing length of allList_inn - BOTH [allList_inn,allList_trn] must be the same shape to cull a pair. ; lengths := EACH (gage shape) allList_inn ; address := grade >= lengths ; %write '[lengths,address]= ' lengths address ; allList_inn_grade allList_trn_grade := address EACHRIGHT choose allList_inn allList_trn ; %EACH write '[allList_inn_grade,allList_trn_grade]= ' allList_inn_grade allList_trn_grade ; % ; %cull the two lists [raw,trn] ; mixList := allList_inn_grade EACHBOTH pair allList_trn_grade ; mixList_cull := cull mixList ; allList_inn_cull allList_trn_cull := [EACH first, EACH second] mixList ; % ; %EACH write '[str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull]= ' str_stdForm allList_inn allList_inn allList_trn allList_inn_cull allList_trn_cull ; % ; %replace allList_inn_cull with allList_trn_cull one at at a time, as textnew changes with each substitution ; %multiple instances of a allList_inn_cull are replaced. ; %write link 'raw str_stdForm= ' str_stdForm ; FOR i WITH tell gage shape allList_inn_cull DO textnew := symExpr_sub allList_inn_cull@i allList_trn_cull@i textnew ; %write allList_inn_cull@i allList_trn_cull@i ; %write link (string i) ' : ' textnew ; ENDFOR ; % ; ENDIF ; % ; textnew } +-----+ Change : +-----+ oops ... forgot to copy most recent +-----+ To : +-----+ symTranslate_string IS OP str_stdForm { LOCAL i ; NONLOCAL symTrans_lineType ; % ; i := 0 ; len := gage shape str_stdForm ; textnew textout := null null ; % ; WHILE (i < len) DO IF (= str_stdForm@i '/') THEN IF ((i + 1) < len) THEN IF (= str_stdForm@(i + 1) '*') THEN textout := link textout '/*' (symTranslate_stringOfType textnew) ; textNew := null ; symTrans_lineType := '/*' ; i := i + 1 ; ELSEIF (= str_stdForm@(i + 1) '$') THEN textout := link textout '/$' (symTranslate_stringOfType textnew) ; textNew := null ; symTrans_lineType := '/$' ; i := i + 1 ; ELSEIF (= str_stdForm@(i + 1) '%') THEN textout := link textout '/%' (symTranslate_stringOfType textnew) ; textNew := null ; symTrans_lineType := '/%' ; i := i + 1 ; ELSE textnew := link textnew str_stdForm@i ; ENDIF ; ENDIF ; ELSE textnew := link textnew str_stdForm@i ; ENDIF ; ENDWHILE ; textout := link textout textnew ; % ; textout } +-----+ ********************************** 17Sep2018 08:38 strOfType_extractTranslate_symGenl - [extract, translate] for each trnType[Lucas, HFLN] cart sym[Parn,Expr] Sub-op core functionality to strOfType_extTranSub_symGenl +-----+ # strOfType_substitute_symExpr_OldNew IS OP symExpr_old symExpr_new strOfType - substitutes symExpr_new for symExpr_old in strOfType # must ensure that the positions found are NOT immediately [preceded,followed] by chrs_symbols_HFLN # 05May2018 based on in_string # 21May2018 big revamp to make it work without erroneous recursion : # replace string_sub with chr_unicode_before_after_str_i # 26Jun2018 revamped to simply convert str to uniList, get rid of chrStr_get # 13Sep2018 at this stage - kind of irrelevant what trnType is, as that is done by strOfType_extractTranslate_symExpr # key idea is that this only applies to a "snippet" of text that is all in one trnType # which prepares the [symExpr_old, symExpr_new] lists that are fed one-by-one here # 13Sep2018 Not used anymore???? superceded by strOfType_extractTranslate_symExpr strOfType_substitute_symExpr_OldNew IS OP symExpr_old symExpr_new strOfType { LOCAL uniList_old uniList_new uniList_str flg_front flg_back flag_follow flag_precede flg_subStart flg_subEnd i_str i_old jump len_new len_old len_str textnew ; % ; IF (NOT OR (symExpr_old symExpr_new EACHLEFT = null)) THEN % ; uniList_old uniList_new uniList_str := EACH str_to_unicodeList symExpr_old symExpr_new strOfType ; len_old len_new len_str := EACH (gage shape) uniList_old uniList_new uniList_str ; i_str i_old := 0 0 ; textnew := null ; flg_subStart := NOT in uniList_old@0 chrs_symbols_HFLN ; flg_subEnd := NOT in uniList_old@(len_old - 1) chrs_symbols_HFLN ; % ; WHILE (i_str < len_str) DO WHILE (AND ((i_old + i_str) < len_str) ( i_old < len_old) (= uniList_old@i_old uniList_str@(i_str + i_old)) ) DO i_old := i_old + 1 ; ENDWHILE ; IF (len_old = i_old) THEN IF (i_str = 0) THEN flg_precede := l ; ELSE flg_precede := NOT in uniList_str@(i_str - 1) chrs_symbols_HFLN ; ENDIF ; IF (len_str = (i_str + len_old)) THEN flg_follow := l ; ELSE flg_follow := NOT in uniList_str@(i_str + len_old) chrs_symbols_HFLN ; ENDIF ; IF (AND (OR flg_precede flg_subStart) (OR flg_subEnd flg_follow)) THEN textnew := link textnew symExpr_new ; i_str := i_str + len_old - 1 ; ELSE textnew := link textnew uniList_str@i_str ; ENDIF ; ELSE textnew := link textnew uniList_str@i_str ; ENDIF ; i_str i_old := (i_str + 1) 0 ; ENDWHILE ; % ; ELSE textnew := strOfType ; ENDIF ; % ; textnew } # %write link '[i_str,i_old]= ' (string i_str) ', ' (string i_old) ; %write ' ' ; %write i_old i_str flg_front flg_back uniList_old symExpr_new uniList_str textnew ; %write textnew ; +-----+ 17Sep2018 16:53 strOfType_extractTranslate_symGenl trim comments # strOfType_extractTranslate_symGenl IS OP strOfType - [extract, translate] for each trnType[Luca, HFLN] cart sym[Parn,Expr] # that come from a string that may have multiple types. # 09Apr2018 in the future I need to specify translation "dictionaries"! (not just use default names!) # 02May2018 keep [spaces,tabs] outside of symbols, standard form within # 02May2018 for now find_HOWELL searches entire trans_old, but I should use an efficient search! # 05May2018 symList_raw components may change to a standard format, but for now expressions don't have a standard form ; # 12Sep2018 strOfType_extractTranslate_symGenl relies on trnType having been set properly # 13Sep2018 strOfType_extractTranslate_symGenl addresses BOTH[symParn, symExpr] # 15Sep2018 This must go sequentially through (symExtr -> symParn) op [symExpr, symParn] ; # for "other" trnTypes, then for current trnType 18Sep2018 Testing of new operators "file_ops.ndf" : +-----+ # file_sortup IS OP pname_inn pname_out # www.BillHowell.ca 18Sep2018 initial file_sortup IS OP pname_inn pname_out { LOCAL fot strList ; fot := open pname_out "r ; strList := readfile_list pname_inn ; strList := sortup strList ; writefile_list strList pname_out EACH close fot ; } # file_sortup '/media/bill/PROJECTS/Lucas - Universal Force/symList english.txt' '/media/bill/ramdisk/symList english.txt' >> OK, works fine! +-----+ # writefile_list IS OP strList pname_out - writefile a list (1D array) of strings # www.BillHowell.ca 18Sep2018 initial writefile_list IS OP strList pname_out { LOCAL fot strList ; fot := open pname_out "w ; fot EACHRIGHT writefile strList ; close fot ; } # a := readfile_list (link d_Lucas 'symList good HFLN.txt') # writefile_list a (link d_QNial_temp 'symList good HFLN.txt') # diff (link d_Lucas 'symList good HFLN.txt') (link d_QNial_temp 'symList good HFLN.txt') 18Sep2018 10:28 Redundant, so removed : +-----+ # symExpr_translate_test IS - substitutes symExpr_new for sub_old in str # must ensure that the positions found are NOT immediately [preceded,followed] by chrs_symbols_HFLN # took data from symExprExtract_stringPosn_test symExpr_translate_test IS { LOCAL test_name t_name t_input t_standard t_result ; NONLOCAL flag_test_comment_log ; EACH write_testStr ' ' '+---------------+' (link 'symExpr_translate_test, ' timestamp) ; write_testStr 'symExpr_translate substitutes symExpr_new for sub_old in str' ; % ; t_name := '# symExpr_translate_test example 1' ; t_input := 'vrp' 'Vons(particle)Rocv(POIo)' 'Bi(r,v,t) = q/c*(vrp)/rs^3 = (v/c)E0(r,t)' ; t_standard := 'Bi(r,v,t) = q/c*(Vons(particle)Rocv(POIo))/rs^3 = (v/c)E0(r,t)' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 2' ; t_input := 'r(rb)' 'Rocv(POIo)(Rocv(POIo)β)' ' e^2*(r·b)*r(rb)/|r2 - r1|^2*6*Bpe^2*Bep^2*(-3/2/π) ' ; t_standard := ' e^2*(r·b)*Rocv(POIo)(Rocv(POIo)β)/|r2 - r1|^2*6*Bpe^2*Bep^2*(-3/2/π) ' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 3' ; t_input := '∂/' 'YAK' '(a·∇) = (a1*n1 + a2*n2 + a3*n3) · (∂/∂x1*n1 + ∂/∂x2*n2 + ∂/∂x3*n3)' ; t_standard := '(a·∇) = (a1*n1 + a2*n2 + a3*n3) · (YAK∂x1*n1 + YAK∂x2*n2 + YAK∂x3*n3)' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 3a' ; t_input := '∂' 'YAK' '(a·∇) = (a1*n1 + a2*n2 + a3*n3) · (∂/∂x1*n1 + ∂/∂x2*n2 + ∂/∂x3*n3)' ; t_standard := '(a·∇) = (a1*n1 + a2*n2 + a3*n3) · (YAK/∂x1*n1 + YAK/∂x2*n2 + YAK/∂x3*n3)' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 4' ; t_input := 'r' 'Rocv(POIo)' '$ = r´/r/sinO *[ ∂/∂O(sinO*Ei(rp,t)·Pp) - ∂/∂P(Ei(rp,t)·O)] ' ; t_standard := '$ = r´/Rocv(POIo)/sinO *[ ∂/∂O(sinO*Ei(rp,t)·Pp) - ∂/∂P(Ei(rp,t)·O)] ' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 5' ; t_input := 'rp' 'Rpcv(POIp)' ' = r´/r/sinO *[ ∂/∂O(sinO*Ei(rp,t)·Pp) - ∂/∂P(Ei(rp,t)·O)] ' ; t_standard := ' = r´/r/sinO *[ ∂/∂O(sinO*Ei(Rpcv(POIp),t)·Pp) - ∂/∂P(Ei(Rpcv(POIp),t)·O)] ' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 6' ; t_input := 'dp[dt' '∂[∂t' '∮(·dl, over ∂Σ : E) = (·dA, over : dp[dt : B] ) ' ; t_standard := '∮(·dl, over ∂Σ : E) = (·dA, over : ∂[∂t : B] ) ' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; % ; t_name := '# symExpr_translate_test example 7' ; t_input := 'Ψ' 'PSI' '∮(·dl, over ∂Σ : E) = (·dA, over : dp[dt : B] ) + Ψ' ; t_standard := '∮(·dl, over ∂Σ : E) = (·dA, over : dp[dt : B] ) + PSI' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; write_testStr 'last char Ψ isn''t recognized in chrs_symbols_HFLN, but is symValid in_unicode_2chrs character' ; % ; t_name := '# symExpr_translate_test example 10' ; t_input := 'vrp' 'Vonv(particle)Rpcv(POIp)' '*(vrp)/' ; t_standard := '*(Vonv(particle)Rpcv(POIp))/' ; t_result := symExpr_translate t_input ; test_comment t_name t_input t_standard t_result ; } +-----+ 18Sep2018 10:28 Redundant, so removed : +-----+ # translate_string_test IS - test correctness of results using known results # www.BillHowell.ca 14Apr2018 initial+---------------+ strOfType_extractTranslate_symExpr_test str_translate_symExpr_test IS { LOCAL test_name t_name t_input t_standard t_result ; NONLOCAL flag_test_comment_log trnType ; EACH write_testStr ' ' '+---------------+' (link 'str_translate_symExpr_test, ' timestamp) ; write_testStr 'str_translate_symExpr translates "simple symbols" and "composite expressions".' ; % ; t_name := '# str_translate_symExpr_test example 1' ; t_input := '/% - dp[dt : EIpds(POIo,t)]/Vons(particle)/cos(AOpc(POIo,t)) ' ; t_standard := '/% - ∂[∂(t): EIpds(POIo,t)]/Vons(particle)/cos(Aθpc(POIo,t)) ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most "composite expressions" as they are in trans[,Expr]_old_HFLN' ; write_testStr 'NOTE : translations of type POIp(t) -> POIp are NOT done by translation tables, done by "symbols compliance POI.sh"' ; % ; t_name := '# str_translate_symExpr_test example 2' ; t_input := '/%- has the term "(ros*cosOo - vos*t)/|ro - vo*t|" . ' ; t_standard := '/%- has the term "(Rocs(POIo)*cos(Aθoc(POIo)) - Vons(particle)*t)/Rpcs(POIp)" . ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'ALL translations should work' ; % ; t_name := '# str_translate_symExpr_test example 2a' ; t_input := '/$- has the term "(ros*cosOo - vos*t)/|ro - vo*t|" . ' ; t_standard := '/$- has the term "(rs*cos(θ) - vs*t)/|r - v*t|" . ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most [syms,exprs] as they are in trans[,Expr]_old_Luca' ; % ; t_name := '# str_translate_symExpr_test example 3' ; t_input := '/$- I have NO real idea of why the (ros*cosOo - vos*t) pops up anyways, and why the cos term all of a sudden (spherical coords does not explain this!)' ; t_standard := '/$- I have NO real idea of why the (rs*cos(θ) - vs*t) pops up anyways, and why the cos term all of a sudden (spherical coords does not explain this!)' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most [syms,exprs] as they are in trans[,Expr]_old_Luca' ; % ; t_name := '# str_translate_symExpr_test example 4' ; t_input := link '/#- has too many ' `" 'c' `" `' 's' ; t_standard := '/#- has too many "c"''s' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'NO translation: comment line only!' ; % ; t_name := '# str_translate_symExpr_test example 5' ; t_input := '/% + 1/Rocs(POIo)/c*dp[dt : |Ei(ro - vo*t,t)|] ] ' ; t_standard := '/% + 1/Rocs(POIo)/c*∂[∂(t): EIods(POIp(t),t)] ] ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'OK, as `% applies trans_Lucas_to_HFLN, which includes Ei' ; % ; t_name := '# str_translate_symExpr_test example 5a' ; t_input := '/$ + 1/Rocs(POIo)/c*dp[dt : | Ei(ro - vo*t,t) |] ] ' ; t_standard := '/$ + 1/rs/c*∂[∂(t): |Ei(r - v*t,t)|] ] ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most [syms,exprs] as they are in trans[,Expr]_old_Luca' ; % ; t_name := '# str_translate_symExpr_test example 6' ; t_input := '/% = vos/c*Rocs(POIo)*sinOo*q/|rov - vo*t|^3*Pph ' ; t_standard := '/% = Vons(particle)/c*Rocs(POIo)*sin(Aθoc(POIo))*Q(particle)/Rpcs(POIp)^3*Rφpch ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'Some translation: [vos,q] are in trans[,Expr]_old_Luca_to_HFLN' ; write_testStr 'NOTE : Rφpch should have a (POI[o,p](t)) phrase, but we cant guess from this.' ; % ; t_name := '# str_translate_symExpr_test example 6a' ; t_input := '/$ = vos/c*Rocs(POIo)*sinOo*q/|rov - vo*t|^3*Pph ' ; t_standard := '/$ = vs/c*rs*sin(θ)*q/|r - v*t|^3*φ´hat ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for all' ; % ; t_name := '# str_translate_symExpr_test example 7' ; t_input := '/% = vos/c*Rocs(POIo)/|rov - vo*t|*sinOo*Pph ' ; t_standard := '/% = Vons(particle)/c*Rocs(POIo)/Rpcs(POIp)*sin(Aθoc(POIo))*Rφpch ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'NO translation: [syms,rxprs] are NOT in trans[,Expr]_old_Luca_to_HFLN' ; write_testStr 'NOTE : Rφpch should have a (POI[o,p](t)) phrase, but we cant guess from this.' ; % ; t_name := '# str_translate_symExpr_test example 8' ; t_input := '/%HFLN = q/c*(vr)/r´s^2 + vov/cEi(rp,tp)' ; t_standard := '/%HFLN = Q(particle)/c*(Vonv_X_Rpcv(POIo(t),t))/Rpcs(POIp)^2 + Vonv(particle)/cEIodv(POIp(t),t)' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for all [syms,exprs], including Ei(rp,tp), which IS IN trans_Lucas_to_HFLN.' ; write_testStr 'NOTE : translations of type POIp(t) -> POIp are NOT done by translation tables, done by "symbols compliance POI.sh"' ; % ; t_name := '# str_translate_symExpr_test example 9' ; t_input := '/$HFLN : ∮(dl, over C : B) = ∬s(·dS : μ0*J + μ0*ε0*dp[dt : E] ) ' ; t_standard := '/$HFLN : ∮[∂(l),overC: B) = ∬[·∂(Area): μ0*J + μ0*ε0*∂[∂(t): ET]) ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for some [syms,exprs] as they are in trans[,Expr]_old_Luca' ; % ; t_name := '# str_translate_symExpr_test example 9a' ; t_input := '/$HFLN : ∮(dl,.over.C : B) = ∬s(·dS : μ0*J + μ0*ε0*dp[dt : E] ) ' ; t_standard := '/$HFLN : ∮[∂(l),.over.C: B) = ∬[·∂(Area): μ0*J + μ0*ε0*∂[∂(t): ET]) ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr '04Jun2018 same as example 9, ' ; % ; t_name := '# str_translate_symExpr_test example 10' ; t_input := '/%[·dl : E(r´,t´)] = -1/c*dp[dt : [dA : B(r,t) •n]] .and.[·dl : E(r´,t´)] = - [dA : dp[dt : B(r,t)]·n]' ; t_standard := '/%[·∂(l) : ETodv(POIp(t),t)] = -1/c*∂[∂(t): [∂(Area): BTodv(POIo,t)•n]] .and.[·∂(l) : ETodv(POIp(t),t)] = - [∂(Area) : ∂[∂(t): BTodv(POIo,t)]·n]' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most [syms,exprs], those that are in trans[,Expr]_Lucas_to_HFLN' ; write_testStr '04Jun2018 The translations [E(r´,t´) -> ETodv(POIp(t),t), B(r,t) -> BTodv(POIo,t)] SHOULD be done!' ; write_testStr 'Instead, improper intermediate symbol substitutions were first made!!!' ; % ; t_name := '# str_translate_symExpr_test example 11' ; t_input := '/%[dA : •n]] ' ; t_standard := '/%[∂(Area) : •n]] ' ; t_result := str_translate_symExpr t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; write_testStr 'translation should work for most [syms,exprs], those that are in trans[,Expr]_Lucas_to_HFLN' ; } +-----+ ****************************** 21Sep2018 10:04 Where am I? Review status of : # strOfType_trn_symListsInnTrn IS OP strOfType symList_inn symList_trn # - [picks out changes, sorts by length] of symList_inn, then subs symList_trn into strOfType) # - strOfTtype is a "text snippet" of any trnType # strOfType_extrTranSub_symGenl IS OP strOfType - [extract, translate] cart sym[Parn,Expr] for oneOf trnType[Luca, HFLN] # that come from a "text snippet" of any trnType # strOfType_extractTranslate_symGenl IS OP strOfType - [extract, translate] for each trnType[Luca, HFLN] cart sym[Parn,Expr] # that come from a string that may have multiple types. # strStdForm_extractTranslate_symGenl IS OP strStdr - prepares a string and a sed expression # for translate_sed using a dictionary, so all dictionary subs are done Reload qnial, then try : strOfType_extractTranslate_symGenl_test qnial> lq_symTests >>> loading start : symbols system loaddefs.ndf <<< loading ended : symbols system loaddefs.ndf >>> loading start : strings.ndf <<< loading ended : strings.ndf >>> loading start : symbols extract.ndf <<< loading ended : symbols extract.ndf >>> loading start : symbols translate.ndf <<< loading ended : symbols translate.ndf >>> loading start : symbols fix.ndf ?undefined identifier: IS SYMPAREN_FILE_BADS D_LUCAS <***> D_QNIAL_TEMP <<< loading ended : symbols fix.ndf errors found: 1 >>> loading start : strings- tests.ndf <<< loading ended : strings- tests.ndf >>> loading start : symbols extract- tests.ndf <<< loading ended : symbols extract- tests.ndf >>> loading start : symbols translate- tests.ndf ?expecting end of block: 'trnType= ' TRNTYPE ; <***> ?expecting an action: <***> } ?expecting end of block: 'trnType= ' TRNTYPE ; <***> ?expecting an action: <***> } ?expecting end of block: 'trnType= ' TRNTYPE ; <***> ?expecting an action: <***> } ?expecting end of block: 'trnType= ' TRNTYPE ; <***> ?expecting an action: <***> } ?undefined identifier: SYMPARN_TRANSLATE_TEST ; STROFTYPE_TRN_SYMLISTSINNTRN_TEST <***> ; ?undefined identifier: SYMEXTRACT_ALLTEST ; SYMPARN_TRANSLATELATE_ALLTEST <***> ; <<< loading ended : symbols translate- tests.ndf errors found: 10 >>> loading start : symbols fix.ndf >> OK, lots of work left yet... qnial> see "strOfType_trn_symListsInnTrn_test ?no such symbol qnial> see "strOfType_extTranSub_symGenl_test ?no such symbol qnial> see "strOfType_extractTranslate_symGenl_test ?no such symbol qnial> see "strStdForm_extractTranslate_symGenl_test ?no such symbol >> Oops - stupid empty lines qnial> lq_symTests ... >>>>>>>>> loading start : symbols translate- tests.ndf ?undefined identifier: SYMEXTRACT_ALLTEST ; SYMPARN_TRANSLATELATE_ALLTEST <***> ; <<<<<<<<< loading ended : symbols translate- tests.ndf errors found: 1 >> OK, changed to symTranslate_alltest >> Now it all loads qnial> symTranslate_alltest ^C bill@dell64 ~ $ >> Why is this hanging up? Do tests one-by-one and find the culprit... +-----+ # symParn_translate_test example 3 : FAILED - result does NOT match standard t_input, t_standard, t_result = r´ Rpcv(POIp) r´ trnType= % translation should work: symbol is in tranList_Lucas_to_HFLN symParn_translate_test example 4 : FAILED - result does NOT match standard t_input, t_standard, t_result = Ei EIodv Ei trnType= % translation should work: symbol is in tranList_Lucas_to_HFLN # symParn_translate_test example 5 : FAILED - result does NOT match standard t_input, t_standard, t_result = Ei(ro - vo*t,t) EIodv(POIp(t),t) Ei(ro - vo*t,t) trnType= % # symParn_translate_test example 8 : FAILED - result does NOT match standard t_input, t_standard, t_result = dp ∂ dp trnType= $ translation should work: symbol is in tranList_Lucas # symParn_translate_test example 14 : FAILED - result does NOT match standard t_input, t_standard, t_result = dφ´ ∂(φ´) dφ´ trnType= $ I added dφ´ to trans_Lucas for this example +-----+ >> all others are OK strOfType_extractFindTrans_symExpr_test - almost all failed, only no-trans examples work. strOfType_trn_symListsInnTrn_test - failed (1 example only but looks good?) strOfType_extTranSub_symGenl_test - failed (1 example only but looks good?) strOfType_extractTranslate_symGenl_test - failed (1 example only but looks good?) qnial> strStdForm_extractTranslate_symGenl_test +-----+ strStdForm_extractTranslate_symGenl_test, Fri Sep 21 12:19:11 2018 strStdForm_extractTranslate_symGenl ONLY translates "composite expressions" that have exact copies in transExpr_table. - otherwise it returns null 11May2018 - poor tests, almost all give null results. - must be changed to properly test strStdForm_extractTranslate_symGenl. ^C bill@dell64 ~ $ +-----+ >> This is the hang-up ***************************** 21Sep2018 13:27 The double-translation (example [Luca -> HFLN, then HFLN -> HFLN] is not a good idea, and setting up separate tranLists is ridiculous. Keep it to ONE tranList (= trn[Parn,Expr] [Luca, HFLN].txt) per trnType, that defines transitions from all other trnLists, as well as corrections to that trnList itselt. Change : +-----+ strOfType_extractTranslate_symGenl IS OP strOfType { LOCAL textnew trnTypeList ; NONLOCAL trnType trnType_old trnTypes ; % ; textnew := strOfType ; trnType_old := trnType ; % ; IF (~= null strOfType) THEN % ; trnTypeList := link ((~= trnType trnTypes) sublist trnTypes) trnType_old ; FOR i WITH trnTypeList DO trnType := trnTypeList@i ; textnew := strOfType_extTranSub_symGenl textnew ; ENDFOR ; % ; ENDIF ; % ; trnType := trnType_old ; textnew } +-----+ To : +-----+ strOfType_extractTranslate_symGenl IS OP strOfType { LOCAL textnew ; NONLOCAL trnType ; % ; textnew := strOfType ; IF (~= null strOfType) THEN textnew := strOfType_extTranSub_symGenl textnew ; ENDIF ; textnew } +-----+ Change : +-----+ strStdForm_extractTranslate_symGenl IS OP strStdr { LOCAL i ; NONLOCAL trnType trnType_old ; % ; i := 0 ; len := gage shape strStdr ; textnew textout := null null ; % ; WHILE (i < len) DO IF (= strStdr@i '/') THEN IF ((i + 1) < len) THEN IF (= strStdr@(i + 1) '*') THEN textout := link textout '/*' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/*' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '$') THEN textout := link textout '/$' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/$' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '%') THEN textout := link textout '/%' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/%' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '^') THEN textout := link textout '/%' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet trnTypeOld ; i := i + 1 ; ELSE textnew := link textnew strStdr@i ; ENDIF ; ENDIF ; ELSE textnew := link textnew strStdr@i ; ENDIF ; ENDWHILE ; textout := link textout textnew ; % ; textout } +-----+ To : +-----+ strStdForm_extractTranslate_symGenl IS OP strStdr { LOCAL i ; NONLOCAL trnType trnTypeOld ; % ; i := 0 ; len := gage shape strStdr ; textnew textout := null null ; % ; WHILE (i < len) DO IF (= strStdr@i '/') THEN IF ((i + 1) < len) THEN IF (= strStdr@(i + 1) '*') THEN textout := link textout '/*' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/*' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '$') THEN textout := link textout '/$' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/$' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '%') THEN textout := link textout '/%' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet '/%' ; i := i + 1 ; ELSEIF (= strStdr@(i + 1) '^') THEN textout := link textout '/%' (strOfType_extractTranslate_symGenl textnew) ; textNew := null ; trnTypeSet trnTypeOld ; i := i + 1 ; ELSE textnew := link textnew strStdr@i ; ENDIF ; ENDIF ; ELSE textnew := link textnew strStdr@i ; ENDIF ; ENDWHILE ; textout := link textout textnew ; % ; textout } +-----+ Change : +-----+ #******************************* # strStdForm_extractTranslate_symGenl IS OP strStdr - prepares a string and a sed expression # for translate_sed using a dictionary, so all dictionary subs are done # 09Apr2018 in the future I need to specify translation "dictionaries"! (not just use default names!) # 02May2018 keep [spaces,tabs] outside of symbols, standard form within # 02May2018 for now find_HOWELL searches entire trans_old, but I should use an efficient search! # if strStdr starts with `$, then it is NOT translated, and the original string is returned # don't spend time on [expr,sym] locations initially, as the strStdr is continually changing! # 05May2018 symList_raw components may change to a standard format, but for now expressions don't have a standard form ; # 05May2018 lines with no [syms,xprs] - errors and waste of time # 21Sep2018 with '/^' note the flip of trnTypeOld, '/^' never becomes the trnType! +-----+ To : +-----+ # strStdForm_extractTranslate_symGenl IS OP strStdr - prepares a string and a sed expression # for translate_sed using a dictionary, so all dictionary subs are done # 09Apr2018 closer to initial form (date?) # 21Sep2018 with '/^' note the flip of trnTypeOld, '/^' never becomes the trnType! +-----+ Remove : +-----+ # strOfType_extractTranslate_symGenl_test IS - test correctness of results using known results # www.BillHowell.ca 04May2018 initial, based on translate_string_test # 21Sep2018 - don't use this!!!!!!!!!!!!! strOfType_extractTranslate_symGenl_test IS { LOCAL test_name t_name t_input t_standard t_result ; NONLOCAL flag_test_comment_log trnType ; EACH write_testStr ' ' '+---------------+' (link 'strOfType_extractTranslate_symGenl_test, ' timestamp) ; write_testStr 'strOfType_extractTranslate_symGenl ONLY translates "composite expressions" that have exact copies in transExpr_table.' ; write_testStr ' - otherwise it returns null' ; write_testStr '11May2018 - poor tests, almost all give null results.' ; write_testStr ' - must be changed to properly test strOfType_extractTranslate_symGenl.' ; % ; t_name := '# strOfType_extractTranslate_symGenl_test example 1' ; trnType := `% ; t_input := '% - dp[dt : EIpds(POIo,t)]/Vons(particle)/cos(AOpc(POIo,t)) ' ; t_standard := (solitary 'dp[dt' ) (solitary '∂[∂(t)') ; t_result := strOfType_extractTranslate_symGenl t_input ; test_comment t_name t_input t_standard t_result ; write_testStr link 'trnType= ' trnType ; } # full set of tests : # # loaddefs '/media/bill/PROJECTS/Qnial/code develop_test/symbols translate- tests.ndf' +-----+ Remove : +-----+ # strOfType_extractTranslate_symGenl IS OP strOfType - [extract, translate] for each trnType[Luca, HFLN] cart sym[Parn,Expr] # that come from a string that may have multiple types. # 12Sep2018 strOfType_extractTranslate_symGenl relies on trnType having been set properly # 21Sep2018 - don't use this!!!!!!!!!!!!! strOfType_extractTranslate_symGenl IS OP strOfType { LOCAL textnew trnTypeList ; NONLOCAL trnType trnType_old trnTypes ; % ; textnew := strOfType ; trnType_old := trnType ; % ; IF (~= null strOfType) THEN % ; trnTypeList := link ((~= trnType trnTypes) sublist trnTypes) trnType_old ; FOR i WITH trnTypeList DO trnType := trnTypeList@i ; textnew := strOfType_extTranSub_symGenl textnew ; ENDFOR ; % ; ENDIF ; % ; trnType := trnType_old ; textnew } # loaddefs link d_Qnial_mine 'symbols translate.ndf' +-----+ #enddoc