open List open Genlex open Str open String open Char type vname = string type term = V of vname | T of (string * (term list)) type subst = (vname*term) list let maiuscula s = let v = s.[0] in ((code v >= code 'A') && (code v <= code 'Z')) let trata s e = match e with [] -> if maiuscula s then V s else T (s,e) | _ -> T (s,e) let lexer = make_lexer ["("; ")"; ","] (* E ::= id F F ::= \epsilon F ::= (E EL) EL ::= ,E EL EL ::= \epsilon *) let rec parse_expr = parser (* corresponde a entrada E da gramatica *) [< 'Ident s; e = parse_F>] -> trata s e and parse_F = parser (* corresponde a entrada E' da gramatica *) [< 'Kwd "("; e = parse_expr; el = parse_EL; 'Kwd ")" >] -> e::el | [< >] -> [] and parse_EL = parser (* corresponde a entrada T' da gramatica *) [< 'Kwd ","; e = parse_expr; el = parse_EL >] -> e::el | [< >] -> [] let parse_expression = parser [< e = parse_expr; _ = Stream.empty >] -> e;; (* função principal de leitura usando streams*) let expression_of_string s = parse_expression(lexer(Stream.of_string s));; let rec string_of_expression e = match e with V s -> s | T (e,el) -> (e^(if el = [] then "" else "("^(aux el)^")")) and aux l = match l with [] -> "" | [e] -> (string_of_expression e) | e::li -> ( (string_of_expression e)^","^aux li)