Advertisement
Guest User

Progettino f# aggiornato pomeriggio

a guest
Nov 17th, 2014
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 6.14 KB | None | 0 0
  1. type indirizzo = {indirizzo: int; valore: float};;
  2. type registro = {nome_reg: string; valore: float};;
  3. type istruzione ={nome_istr: string;
  4.                   arg1_reg: registro;
  5.                   arg1_mem: indirizzo;
  6.                   arg2_reg: registro;
  7.                   arg2_mem: indirizzo;
  8.                   arg2_float: float}
  9.  
  10. (* la funzione che divide l'elemento della lista di input in una lista di stringhe
  11. e una funzione che legge dalla memoria
  12. oppure scrive nella memoria e una funzione che scrive nel registro
  13. e legge dal registro una funzione che individua che funzione deve essere eseguita
  14. , una funzione che analizza gli argomenti della funzione ( se memoria registro oppure costante )
  15. il resto sono le funzioni da eseguire con scrivi registro / memoria oppure leggi memoria / registro*)
  16.  
  17. //istruzioni per il caricamento dell'istruzione
  18.  
  19.  
  20.  
  21. int('a');;//97
  22. int('z');;//122
  23. int('A');;//65
  24. int('Z');;//90
  25. int(' ');;//32
  26. int('1');;//49
  27. int('9');;//57
  28. int('0');;//48
  29.  
  30. //rimuovere dalla lista tutti i caratteri a parte lettere/numeri e spazi
  31. let rec rmv_interpunzione (lst: char list) : char list = match lst with
  32.     []->[]
  33.     |x::xs->if(x>='a' && x<='z')||(x>='A' && x<='Z')||(x>='0' && x<='9')||x=' '||x='['||x=']' then x::rmv_interpunzione(xs) else rmv_interpunzione(xs);;
  34.  
  35. let test_string = "Ciao, mi; chiamo: Riccardo 1985";;
  36. let list_from_string = string_to_list test_string;;
  37. let test_rmv_int = rmv_interpunzione list_from_string;;
  38.  
  39. //dividere lista dell'istruzione con split
  40. let position (lst, item) =
  41.     let rec aux (n, list) = match (n, list) with
  42.         (_,[])-> -1
  43.         |(n, x::xs)->if x = item then n else aux(n+1, xs)
  44.     in aux (0, lst);;
  45.  
  46. let rec take n lst = match (n, lst) with
  47.     (0,_)->[]
  48.     |(_,[])->[]
  49.     |(n,x::xs)->x::(take (n-1) xs);;
  50.  
  51. let rec diff lst1 lst2= match (lst1,lst2) with
  52.     [],[]->[]
  53.     |xs,[]->[]
  54.     |[],ys->ys
  55.     |x::xs,y::ys->if x=y then diff xs ys else y::diff xs ys;;
  56.  
  57. let rmv_split (item: char) (lst: char list): char list =
  58.     match (item, lst) with
  59.     (x,[])->[]
  60.     |(x,y::ys) when position(y::ys, x) = -1->y::ys
  61.     |(x, y::ys) when position(y::ys, x) <> -1-> diff (take (position(y::ys,x)+1) (y::ys)) (y::ys);;
  62.  
  63. let rec split (x : char) (xs : char list) : char list list = match (x, xs) with
  64.     (x,[])->[]
  65.     |(x, y::ys) when position(y::ys, x) = -1->[y::ys]
  66.     |(x, y::ys) when position(y::ys, x) <> -1-> let aux = (take (position(y::ys,x)) (y::ys))
  67.                                                 in [aux]@split x (rmv_split x (y::ys));;
  68.  
  69. //dividere la lista di stringhe
  70.  
  71. let test_string = "Ciao, mi; chiamo: Riccardo 1985";;
  72.  
  73. // lista di stringhe che compone un programma
  74. let string_list_program =   ["MOV [0] 0"; "MOV [1] 1"; "MOV [2] 0"; "MOV [3] 0"; "MOV [4] 1";
  75.    "MOV [10] 1"; "MOV [11] 1"; "MOV [12] 0"; "MOV [13] 0"; "MOV [14] 0";
  76.    "MOV REG1 [4]"; "MOV REG2 [14]"; "NOT REG3 REG1"; "NOT REG4 REG2";
  77.    "AND REG1 REG4"; "AND REG2 REG3"; "OR REG1 REG2"; "MOV [24] REG1";
  78.    "MOV REG1 [3]"; "MOV REG2 [13]"; "NOT REG3 REG1"; "NOT REG4 REG2";
  79.    "AND REG1 REG4"; "AND REG2 REG3"; "OR REG1 REG2"; "MOV [23] REG1";
  80.    "MOV REG1 [2]"; "MOV REG2 [12]"; "NOT REG3 REG1"; "NOT REG4 REG2";
  81.    "AND REG1 REG4"; "AND REG2 REG3"; "OR REG1 REG2"; "MOV [22] REG1";
  82.    "MOV REG1 [1]"; "MOV REG2 [11]"; "NOT REG3 REG1"; "NOT REG4 REG2";
  83.    "AND REG1 REG4"; "AND REG2 REG3"; "OR REG1 REG2"; "MOV [21] REG1";
  84.    "MOV REG1 [0]"; "MOV REG2 [10]"; "NOT REG3 REG1"; "NOT REG4 REG2";
  85.    "AND REG1 REG4"; "AND REG2 REG3"; "OR REG1 REG2"; "MOV [20] REG1"; "END"];;
  86.  
  87. //da stringa a lista
  88. let string_to_list (s : string) = s.ToCharArray() |> Array.toList;;
  89.  
  90. //dividere le istruzioni (ogni stringa รจ un istruzione)
  91. //trasformo la lista di stringhe in una lista di liste di caratteri
  92. let rec dividi_istruzione (lst: string list) : char list list =
  93.     match lst with
  94.     []->[]
  95.     |x::xs->[string_to_list(x)]@dividi_istruzione xs;;
  96. let test_dividi_istr = dividi_istruzione string_list_program;;
  97.  
  98. //pulisco la lista da eventuali caratteri non consentiti
  99. let rec rmv_interpunzione (lst: char list) : char list = match lst with
  100.     []->[]
  101.     |x::xs->if(x>='a' && x<='z')||(x>='A' && x<='Z')||(x>='0' && x<='9')||x=' '||x='['||x=']' then x::rmv_interpunzione(xs) else rmv_interpunzione(xs);;
  102.  
  103. let rec pulisci_istruzioni (lst: char list list): char list list =
  104.     match lst with
  105.     []->[]
  106.     |x::xs->rmv_interpunzione(x)::pulisci_istruzioni xs;;
  107.  
  108. let test_pulisci = pulisci_istruzioni test_dividi_istr;;
  109. //ora posso dividere ogni lista di caratteri in sottoliste che saranno la mia istruzione e i miei argomenti
  110. //divido gli argomenti di ogni lista, rimuovendo gli spazi in sottoliste
  111. let rec list_to_string (l : char list) =
  112.   match l with
  113.   | [] -> ""
  114.   | c :: cs -> (string c) + (list_to_string cs);;
  115.  
  116. let rec dividi_argomenti (lst: char list list) : string list list =
  117.     match lst with
  118.     []->[]
  119.     |x::xs->(split ' ' x)::dividi_argomenti(xs);;
  120.  
  121.  
  122. let test_div_arg = dividi_argomenti test_pulisci;;
  123.  
  124. let test_instruction = [['M'; 'O'; 'V']; ['['; '0'; ']']; ['0']];;
  125.  
  126. let rec confronta_lst (lst1: char list) (lst2: char list) : bool =
  127.     match (lst1, lst2) with
  128.     ([],[])->true
  129.     |([x],[y])->if x = y then true else false
  130.     |([],_)->false
  131.     |(_,[])->false
  132.     |(x::xs,y::ys)->if x=y then true && confronta_lst xs, ys else false;;
  133.  
  134. let test_lst_1= ['M'; 'O'; 'V'];;
  135. let test_lst_2= ['['; '0'; ']'];;
  136. let test_confronta = confronta_lst test_lst_1 test_lst_2;;
  137.  
  138. //interpretare una istruzione
  139. let rec istruzione_stringa (istruzione: char list list) : string list =
  140.     match istruzione with
  141.     []->[]
  142.     |x::xs->(list_to_string x)::istruzione_stringa(xs);;
  143.  
  144. let rec nth lst k = match (lst, k) with
  145.     (x::xs, 0)->x
  146.     |(x::xs, k)->(nth xs k-1);;
  147.  
  148. let interpreta_istruzione (istruzione: char list list) : istruzione =
  149.     if confronta_lst(nth(test_instruction),test_lst_1) = true then  
  150.          
  151. //non so se serva il controllo, adesso devo capire come si mettono i vari valori nel record, li scelgo con nth e poi li devo associare ai vari campi presumo  
  152.  
  153.  
  154.    
  155. //dividere ogni istruzione in nome istruzione, argomento1, argomento2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement