#] #] ********************* #] loaddefs link d_Qndfs 'port_translate_Matlab_to_QNial.ndf' # www.BillHowell.ca started 06May2013, total revamp 09May2013 # Based on GREP_Fortran_to_QNial.ndf, 13Feb07, www.BillHowell.ca # WARNINGS # Operation priorities - because Q'Nial is a 'fair and level playing field', these # MUST be explicitly put in by parenthesis # WATCH OUT! # 08Feb2021 - left long ago in state of change,code needs fixing f_translateMatlabToQnial := 'port_translate_Matlab_to_QNial.ndf' ; loaddefs_start f_translateMatlabToQnial ; For convenience - move this to the end of the new file !! : loaddefs_ended f_translateMatlabToQnial ; # enddoc #**************************** # List of operators, generated with : # $ cat "$d_Qndfs""port_translate_Matlab_to_QNial.ndf" | grep "^#]" | sed 's/^#\]/ /' # ********************* loaddefs link d_Qndfs 'port_translate_Matlab_to_QNial.ndf' seq IS OP a b - output_funcEnd IS - clean_func_declare IS OP func_declare - test_state_line IS OP state_phrase - translate_Matlab_to_QNial IS OP filename_in filename_out - g IS translate_Matlab_to_QNial filename_in filename_out ; - #******************************************* # Setup (kind of like header info) # Reminder of debug setup... # IF flag_break = l THEN Break ; ENDIF ; # is_blankstring IS OP Str - This operation tests whether a string is entirely "whitespace" (space, tab, CR, NL) # string_split_by_string_with_sub S1 S2 S3 splits S2 at each point that S1 occurs, and puts in S3 in place of S1 # note that this operator is necessary because I haven't compiled Qial with "regexp" - regular expression operators? # need to save this to MY_NDFs!! # seq IS OP a b { + a (tell (b - a + 1)) } % b MUST be > a !!! ; IF flag_debug THEN write 'loading seq' ; ENDIF ; #] seq IS OP a b - seq IS OP a b { IF b > a THEN z := + a (tell (b - a + 1)) ; ELSE z := + a (-1 * (tell (a - b + 1)) ) ; ENDIF ; z } # ************************** # Constants and Symbols - can redefine "standard lists" of strings.ndf here # 09May2013 - no changes for now # NONLOCAL charr char_symbols_double char_symbols_double_len char_symbols_single char_symbols_single_len chars_white fin fout func_names func_names_len func_started line_comment_func line_matlab line_nial state_line state_phrase res_list var_names var_names_len woird5 ; % ; line_comment_func := '#*************************************' ; line_empty_inn_OP := ' % ; ' ; line_empty_out_OP := '' ; # used in is_blankstring in file 'strings.ndf' chars_white := each char 9 10 13 32 ; % tab newline carriagereturn space ; res_list := '' ; line_matlab := '' ; line_nial := '' ; fin := 0 ; fout := 1 ; State_line := "blank ; woird5 := '' ; #***************************************** # Translation of symbols char_symbols_double := `= ' := ' '==' '=' `* '*' '**' ' power ' `~ ' NOT ' '~=' '~=' ; n := gage shape char_symbols_double ; char_symbols_double := cols (floor (n/4) 4 reshape char_symbols_double) ; char_symbols_double_len := gage shape first char_symbols_double ; # chars_symbols_single - have ONLY one-character symbol use in matlab, # otherwise put into doubles!! char_symbols_single := `% `% `' `' `" `" `+ `+ `- `- `/ `/ `& ' AND ' `\ `\ `| `| `; `; `: ' seq ' `, `, `. `. `< `< `> `> `^ `^ ; n := gage shape char_symbols_single ; char_symbols_single := cols (floor (n/2) 2 reshape char_symbols_single) ; char_symbols_single_len := gage shape char_symbols_single ; char_brackets := `( `( `) `) `[ `[ `] `] `{ `{ `} `} ; n := gage shape char_brackets ; char_symbols_single := cols (floor (n/2) 2 reshape char_symbols_single) ; char_symbols_single_len := gage shape char_symbols_single ; # These symbol strings don't change one way or another so aren't treated specially : `< '<=' '<=' # As far as I know these symbols aren't used in matlab... `< '<>' '~=' etc... #***************************************** # Function names - system and user func_names := 'acos' 'arccos' 'asin' 'arcsin' 'atan' 'arctan' 'if' 'IF' 'then' 'THEN' 'else' 'ELSE' 'elseif' 'ELSEIF' 'endif' 'ENDIF' 'for' 'FOR' 'case' 'CASE' 'end case' 'ENDCASE' 'write' 'writescreen ' 'read' 'readfile ' 'int(' 'floor' ; n := gage shape func_names ; func_names := cols (floor (n/2) 2 reshape func_names) ; func_names_len := gage shape first func_names ; #***************************************** # Variable names - system and user var_names := 'pi' 'pi' ; n := gage shape var_names ; var_names := cols (floor (n/2) 2 reshape var_names) ; var_names_len := gage shape first var_names ; #***************************************** # Main program func_started := o ; IF flag_debug THEN write 'loading output_funcEnd' ; ENDIF ; #] output_funcEnd IS - output_funcEnd IS { NONLOCAL charr char_symbols_double char_symbols_double_len char_symbols_single char_symbols_single_len chars_white fin fout func_names func_names_len func_started line_comment_func line_empty_inn_OP line_matlab line_nial state_line state_phrase res_list var_names var_names_len woird5 ; % ; IF func_started THEN writefile fout line_empty_inn_OP ; writefile fout (link ' ' res_list ' ') ; fout EACHRIGHT writefile '} ' '' '' ; ENDIF ; } IF flag_debug THEN write 'loading clean_func_declare' ; ENDIF ; #] clean_func_declare IS OP func_declare - clean_func_declare IS OP func_declare { NONLOCAL charr char_symbols_double char_symbols_double_len char_symbols_single char_symbols_single_len chars_white fin fout func_names func_names_len func_started line_comment_func line_empty_inn_OP line_matlab line_nial state_line state_phrase res_list var_names var_names_len woird5 ; % ; output_funcEnd ; % This is from the LAST function declared - empty if none so far ; func_declare := regexp_substitute ',' ' ' func_declare ; % ; % extract list of results ; IF ((find `[ func_declare) < (gage shape func_declare)) THEN res_start res_end := `[ `] EACHLEFT find func_declare ; res_start := res_start + 1 ; res_end := res_end - 1 ; ELSE % in this case there is only one result_name, which occurs ; % between 'function' and '='. Here I ASSUME thatthe word 'function' ; % starts at the befginning of the line! ; res_start res_end := gage (func_declare EACHRIGHT str_find1stChrOf_subStr ('function' '=')) ; res_start := res_start + 8 ; res_end := res_end - 1 ; ENDIF ; res_list := stripblanks func_declare|[ res_start + tell (res_end - res_start + 1) ] ; % ; % extract list of arguments; arg_start arg_end := `( `) EACHLEFT find func_declare ; arg_start := arg_start + 1 ; arg_end := arg_end - 1 ; arg_list := func_declare|[ arg_start + tell (arg_end - arg_start + 1) ] ; % ; % extract function name ; fun_start fun_end := `= `( EACHLEFT find func_declare ; fun_start := fun_start + 1 ; fun_end := fun_end - 1 ; fun_name := stripblanks func_declare|[ fun_start + tell (fun_end - fun_start + 1) ] ; % ; % output ; fout EACHRIGHT writefile line_comment_func '# ' '' ; writefile fout (tostring (fun_name ' IS OP ' arg_list)) ; % ?had "tostring? for list of strings! ; func_started := l ; } # keep in mind (defined near begining of code) : state_line := "blank ; % from "comment "string "white "symbol "word ; IF flag_debug THEN write 'loading test_state_line' ; ENDIF ; #] test_state_line IS OP state_phrase - test_state_line IS OP state_phrase { NONLOCAL charr char_symbols_double char_symbols_double_len char_symbols_single char_symbols_single_len chars_white fin fout func_names func_names_len func_started line_comment_func line_empty_inn_OP line_matlab line_nial state_line res_list var_names var_names_len woird5 word_type ; % note that 'state_phrase' was removed from NONLOCAL here as it is an argument!! ; % ; IF ~= state_line state_phrase THEN IF = state_line "word THEN woird5_strt := line_matlab str_find1stChrOf_subStr woird5 ; woird5_endd := woird5_strt + (gage shape woird5) ; IF ((word_number := find woird5 func_names@[0]) < func_names_len) THEN word_type := "func ; % note that user func_names should be added as user functions are picked out ; ELSEIF ((word_number := find woird5 var_names@[0] ) < var_names_len ) THEN word_type := "varb ; ELSE word_type := "varb ; var_names := mix (append (rows var_names) (woird5 woird5)) ; % note the assumption that an unknown word must be a variable ; ENDIF ; line_nial := link line_nial woird5 ; woird5 := '' ; ELSEIF (NOT in state_phrase ("comment "string "white "symbol "word)) THEN fault (link '?test_state_line - unknown state_phrase : ' (string state_phrase)) ; ENDIF ; ENDIF ; % ; state_line := state_phrase ; } IF flag_debug THEN write 'loading translate_Matlab_to_QNial' ; ENDIF ; #] translate_Matlab_to_QNial IS OP filename_in filename_out - translate_Matlab_to_QNial IS OP filename_in filename_out { NONLOCAL charr char_symbols_double char_symbols_double_len char_symbols_single char_symbols_single_len chars_white fin fout func_names func_names_len func_started line_comment_func line_empty_inn_OP line_matlab line_nial state_line state_phrase res_list var_names var_names_len woird5 ; % ; fin := open Filename_in "r ; fout := open Filename_out "w ; % ; % file header info ; writefile fout line_comment_func ; writefile fout (link '# ' Filename_in ' : Partial translation, matlab code to Q' (`') 'Nial programming language ') ; writefile fout (link '# by Q' (`') 'Nial program "translate_Matlab_to_QNial", from www.BillHowell.ca') ; writefile fout '# version 10May2013' ; fout EACHRIGHT writefile '' '' '' ; % ; WHILE ((line_matlab := readfile fin) ~= ??eof) DO % ; IF is_blankstring line_matlab THEN IF func_started THEN writefile fout line_empty_inn_OP ; ELSE writefile fout line_empty_out_OP ; ENDIF ; % ; ELSE i := -1 ; i_max := gage shape line_matlab ; line_nial := '' ; IF i_max > 8 THEN IF ('function' = (8 take line_matlab)) THEN clean_func_declare line_matlab ; line_nial := '{ ' ; i_max := 99999 ; ENDIF ; ENDIF ; % ; woird5 := '' ; state_line := "blank ; WHILE i < (i_max - 1) DO i := i + 1 ; charr := line_matlab@[i] ; % ; % state_line from "blank "comment "string "white "symbol "word ; IF = state_line "comment THEN line_nial := link line_nial charr ; ELSEIF = `' charr THEN IF i > 0 THEN IF ~= line_matlab@[i-1] `` THEN test_state_line "string ; ENDIF ; ELSE test_state_line "string ; ENDIF ; line_nial := link line_nial charr ; ELSEIF = state_line "string THEN line_nial := link line_nial charr ; ELSEIF = `% charr THEN test_state_line "comment ; line_nial := link line_nial charr ; ELSEIF in charr chars_white THEN test_state_line "white ; line_nial := link line_nial charr ; ELSEIF ((posn := find charr char_symbols_double@[1]) < char_symbols_double_len) THEN state_old := state_line ; test_state_line "symbol ; IF = state_old "word THEN % in matab, does no space mean it must be a variable or function? ; IF = word_type "varb THEN % no changes to type of parenthesis required for functions ; IF (< (i + 1) i_max) THEN IF (= char_symbols_double@@[2, posn] (link charr line_matlab@[i + 1]) ) THEN line_nial := link line_nial char_symbols_double@@[3, posn] ; i := i + 1 ; line_nial := link line_nial char_symbols_double@@[1, posn] ; ENDIF ; ELSE line_nial := link line_nial char_symbols_double@@[1, posn] ; ENDIF ; % ; ELSEIF ((posn := find charr char_symbols_single@[1]) < char_symbols_single_len) THEN line_nial := link line_nial char_symbols_single@@[1, posn] ; test_state_line "symbol ; % ; % if it's not in a comment, string, and isn't a symbol, white, ; % it must be a word (var or func name) ; ELSE test_state_line "word ; woird5 := link woird5 charr ; ENDIF ; ENDWHILE ; % ; char_last := char_nonblank_before line_nial (- (gage shape line_nial) 1) ; IF (AND (char_last EACHRIGHT ~= `; `{ `} )) THEN line_nial := append line_nial ' ; ' ; ENDIF ; writefile fout line_nial ; line_nial := '' ; ENDIF ; % ; ENDWHILE ; % ; % output to "close" last function ; output_funcEnd ; close fin ; close fout ; } # IF flag_break = l THEN Break ; ENDIF ; #************************************* # EXAMPLES dir_inn := '/media/bill/SWAPPER/Qnial/Cheng - semi-tensor and switching control, Matlab toolbox/stp/' ; dir_out := '/media/bill/SWAPPER/Qnial/Cheng - semi-tensor and switching control, Matlab toolbox/nial/' ; filename_in := link dir_inn 'stdform.m' ; filename_out := link dir_out 'stdform.ndf' ; IF flag_debug THEN write 'loading g' ; ENDIF ; #] g IS translate_Matlab_to_QNial filename_in filename_out ; - g IS translate_Matlab_to_QNial filename_in filename_out ; #************************************* # Problems : # 09May2013 : word translation matlab - qnial is still missing! symbol translation isn't working! extra line after IS OP # enddoc