1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| type ('a, 'b) arbre_bin =
| Leaf of 'b
| Node of ('a, 'b) arbre_bin * 'a * ('a, 'b) arbre_bin
let print_tree tree =
let indent n =
for x = 1 to n do print_string "| " done in
let rec aux tree n = match tree with
| Leaf a -> indent n; print_int a; print_newline ()
| Node(fg, r, fd) ->
indent n; print_endline r;
aux fg (n+1); aux fd (n+1)
in aux tree 0
open Genlex
let lexer =
let rec minus = parser
| [< ''-'; s >] -> [< ''-'; '' '; minus s >]
| [< 'a; s >] -> [< 'a; minus s >]
| [< >] -> [< >] in
let lexer =
let keywords = ["("; ")"; "+"; "-"; "*"; "/"] in
make_lexer keywords in
fun str -> lexer (minus (Stream.of_string str))
let parse =
let op_parser op_list next_level =
let rec loop gauche = parser
| [< 'Kwd op when List.mem op op_list; droite = next_level; s >] ->
loop (Node (gauche, op, droite)) s
| [< >] -> gauche in
parser [< acc = next_level; s >] -> loop acc s in
let rec ope_low s = op_parser ["+"; "-"] ope_hight s
and ope_hight s = op_parser ["*"; "/"] pth s
and pth = parser
| [< 'Int n >] -> Leaf n
| [< 'Kwd "("; e = ope_low; 'Kwd ")" >] -> e
in ope_low
let rec execute tree = match tree with
| Leaf n -> n
| Node(fg, r, fd) ->
let gauche, droite = execute fg, execute fd in
match r with
| "+" -> gauche + droite
| "-" -> gauche - droite
| "*" -> gauche * droite
| "/" -> gauche / droite
| _ -> failwith "Fonction non connue."
let () =
let chaine = read_line() in
let tokens = lexer chaine in
let arbre = parse tokens in
print_tree arbre;
print_int (execute arbre);
print_newline () |
Partager