Esta página mostra as diferenças entre as duas revisões da página.
| Ambos os lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
|
ocaml [2006/08/29 22:35] marcus |
ocaml [2010/01/18 15:45] (Actual) |
||
|---|---|---|---|
| Linha 47: | Linha 47: | ||
| ===== Sintaxe abstrata do IMP ===== | ===== Sintaxe abstrata do IMP ===== | ||
| - | <code> | + | <code ocaml> |
| (* categoria sintatica Num *) | (* categoria sintatica Num *) | ||
| type num = int;; | type num = int;; | ||
| Linha 79: | Linha 79: | ||
| ===== Estados ===== | ===== Estados ===== | ||
| - | <code> | + | <code ocaml> |
| (* o estado: uma função das identificadores para números inteiros *) | (* o estado: uma função das identificadores para números inteiros *) | ||
| type sigma = ident -> num;; | type sigma = ident -> num;; | ||
| Linha 91: | Linha 91: | ||
| ===== Avaliação de expressões aritméticas ===== | ===== Avaliação de expressões aritméticas ===== | ||
| - | <code> | + | <code ocaml> |
| (* avaliação das expressões aritméticas *) | (* avaliação das expressões aritméticas *) | ||
| let rec eval_aExpr (a,sigma) = | let rec eval_aExpr (a,sigma) = | ||
| Linha 101: | Linha 101: | ||
| | Prod (a1,a2) -> (eval_aExpr (a1,sigma))*(eval_aExpr (a2,sigma)) | | Prod (a1,a2) -> (eval_aExpr (a1,sigma))*(eval_aExpr (a2,sigma)) | ||
| ;; | ;; | ||
| - | </code> | ||
| - | |||
| - | |||
| - | |||
| - | ===== Exercício 4.2: SOE de IMP em OCaml ===== | ||
| - | <code> | ||
| - | type estado = Final of sigma | Intermediario of com * sigma;; | ||
| - | |||
| - | exception SemSuccessor;; | ||
| - | |||
| - | (* avaliação dos comandos: semântica operacional estrutural *) | ||
| - | let rec eval_one_com_est = function | ||
| - | Final s -> raise SemSuccessor | ||
| - | | Intermediario (Skip,s) -> Final s | ||
| - | | Intermediario (Assign(l,a),s) -> Intermediario (Skip,mapsto s l (eval_aExpr (a,s))) | ||
| - | | Intermediario (Seq(c1,c2),s) -> let e = eval_one_com_est (Intermediario (c1,s)) in | ||
| - | begin | ||
| - | match e with | ||
| - | Final s' -> Intermediario(c2,s') | ||
| - | | Intermediario(c1',s') -> Intermediario(Seq(c1',c2),s') | ||
| - | end | ||
| - | | Intermediario (Cond(b,c1,c2),s) -> if eval_bExpr(b,s) then Intermediario(c1,s) else Intermediario(c2,s) | ||
| - | | Intermediario (While (b,c1) as w,s) -> Intermediario(Cond(b,Seq(c1,w),Skip),s) | ||
| - | | Intermediario (_,s) -> raise SemSuccessor | ||
| - | ;; | ||
| - | |||
| - | let rec eval_com_est e = try e::(eval_com_est (eval_one_com_est e)) with SemSuccessor -> [e];; | ||
| - | |||
| - | (* Exemplo *) | ||
| - | let programa = Seq(Assign("n",Num 1),Seq(Assign("x",Num 1),While(Lt(Loc "n",Num 10),Seq(Assign("x",Prod(Loc "x",Loc "n")),Assign("n",Sum(Loc "n", Num 1))))));; | ||
| - | |||
| - | # eval_com_est (Intermediario(programa,empty));; | ||
| - | - : estado list = | ||
| - | [Intermediario | ||
| - | (Seq (Assign ("n", Num 1), | ||
| - | Seq (Assign ("x", Num 1), | ||
| - | While (Lt (Loc "n", Num 10), | ||
| - | Seq (Assign ("x", Prod (Loc "x", Loc "n")), | ||
| - | Assign ("n", Sum (Loc "n", Num 1)))))), | ||
| - | <fun>); | ||
| - | Intermediario | ||
| - | (Seq (Skip, | ||
| - | Seq (Assign ("x", Num 1), | ||
| - | While (Lt (Loc "n", Num 10), | ||
| - | Seq (Assign ("x", Prod (Loc "x", Loc "n")), | ||
| - | Assign ("n", Sum (Loc "n", Num 1)))))), | ||
| - | <fun>); | ||
| - | Intermediario | ||
| - | (Seq (Assign ("x", Num 1), | ||
| - | While (Lt (Loc "n", Num 10), | ||
| - | Seq (Assign ("x", Prod (Loc "x", Loc "n")), | ||
| - | Assign ("n", Sum (Loc "n", Num 1))))), | ||
| - | <fun>); | ||
| - | |||
| - | ... | ||
| </code> | </code> | ||