Advertisement
Guest User

Progettino_f#

a guest
Nov 17th, 2014
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 4.68 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.  
  111.  
  112.    
  113. //dividere ogni istruzione in nome istruzione, argomento1, argomento2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement