more housekeeping ; add programs to multifix-parser

This commit is contained in:
Galfour 2019-04-07 16:29:14 +00:00
parent d12ec7d4eb
commit d98f92ce9c
3 changed files with 34 additions and 18 deletions

View File

@ -1 +1,5 @@
let toto = at * bo in list [ toto ; tata ; titi ] const foo =
let toto = at * bo in list [ toto ; tata ; titi ] ;
const bar =
cat + maow ;

View File

@ -77,6 +77,7 @@ module O = struct
let get_op : n_operator -> operator = get_content let get_op : n_operator -> operator = get_content
let manual_singleton name menhir_codes ast_code : singleton = Manual (make_name name {menhir_codes ; ast_code}) let manual_singleton name menhir_codes ast_code : singleton = Manual (make_name name {menhir_codes ; ast_code})
let rule_singleton rule : singleton = Generated rule
let language entry_point singletons hierarchies = {entry_point ; singletons ; hierarchies} let language entry_point singletons hierarchies = {entry_point ; singletons ; hierarchies}
@ -134,7 +135,7 @@ module Print_AST = struct
open Format open Format
let manual_rule : _ -> O.manual_rule -> _ = fun ppf mr -> let manual_rule : _ -> O.manual_rule -> _ = fun ppf mr ->
fprintf ppf "type %s = %s" mr.name mr.content.ast_code fprintf ppf "%s = %s" mr.name mr.content.ast_code
let generated_rule : _ -> O.rule -> _ = fun ppf gr -> let generated_rule : _ -> O.rule -> _ = fun ppf gr ->
let aux : _ -> O.rhs -> _ = fun ppf rhs -> let aux : _ -> O.rhs -> _ = fun ppf rhs ->
@ -148,10 +149,10 @@ module Print_AST = struct
List.filter_map aux rhs in List.filter_map aux rhs in
let type_element = fun ppf te -> fprintf ppf "%s" te in let type_element = fun ppf te -> fprintf ppf "%s" te in
fprintf ppf "| %s of (%a)" fprintf ppf "| %s of (%a)"
gr.name (String.capitalize_ascii gr.name)
PP.(list_sep type_element (const " * ")) type_elements PP.(list_sep type_element (const " * ")) type_elements
in in
fprintf ppf "type %s=@. @[<v>%a@]" gr.name fprintf ppf "%s = @. @[<v>%a@]" gr.name
PP.(list_sep aux new_line) gr.content PP.(list_sep aux new_line) gr.content
let singleton : _ -> O.singleton -> _ = fun ppf s -> let singleton : _ -> O.singleton -> _ = fun ppf s ->
@ -159,6 +160,12 @@ module Print_AST = struct
| Manual s -> manual_rule ppf s | Manual s -> manual_rule ppf s
| Generated s -> generated_rule ppf s | Generated s -> generated_rule ppf s
let singletons : _ -> O.singleton list -> _ = fun ppf ss ->
match ss with
| [] -> ()
| hd :: tl ->
fprintf ppf "%a\n" (PP.prepend "type " singleton) hd ;
fprintf ppf "%a" PP.(list_sep (prepend "and " singleton) (const "\n")) tl
let n_operator level_name : _ -> O.n_operator -> _ = fun ppf nop -> let n_operator level_name : _ -> O.n_operator -> _ = fun ppf nop ->
let type_elements = let type_elements =
@ -174,18 +181,26 @@ module Print_AST = struct
(get_name nop) (get_name nop)
PP.(list_sep type_element (const " * ")) type_elements PP.(list_sep type_element (const " * ")) type_elements
let n_hierarchy : _ -> O.n_hierarchy -> _ = fun ppf nh -> let n_hierarchy t : _ -> O.n_hierarchy -> _ = fun ppf nh ->
let levels = List.Ne.map get_content ((get_content nh).levels) in let levels = List.Ne.map get_content ((get_content nh).levels) in
let nops = List.Ne.concat levels in let nops = List.Ne.concat levels in
let name = get_name nh in let name = get_name nh in
fprintf ppf "type %s =@.@[%a@]" fprintf ppf "%s %s =@.@[%a@]" t
name name
PP.(list_sep (n_operator name) new_line) nops PP.(list_sep (n_operator name) new_line) nops
let n_hierarchies (first:bool) : _ -> O.n_hierarchy list -> _ = fun ppf ss ->
match ss with
| [] -> ()
| hd :: tl ->
fprintf ppf "%a\n" (n_hierarchy (if first then "type" else "and")) hd ;
fprintf ppf "%a" PP.(list_sep (prepend "and " (n_hierarchy "and")) (const "\n")) tl
let language : _ -> O.language -> _ = fun ppf l -> let language : _ -> O.language -> _ = fun ppf l ->
fprintf ppf "%a@.@." PP.comment "Language" ; fprintf ppf "%a@.@." PP.comment "Language" ;
fprintf ppf " %a@.%a@.@." PP.comment "Singletons" PP.(list_sep singleton new_line) l.singletons ; let first = List.length l.singletons = 0 in
fprintf ppf " %a@.%a@." PP.comment "Hierarchies" PP.(list_sep n_hierarchy (new_lines 2)) l.hierarchies ; fprintf ppf " %a@.%a@.@." PP.comment "Singletons" singletons l.singletons ;
fprintf ppf " %a@.%a@." PP.comment "Hierarchies" (n_hierarchies first) l.hierarchies ;
fprintf ppf " %a@.type entry_point = %s Location.wrap@.@." PP.comment "Entry point" l.entry_point ; fprintf ppf " %a@.type entry_point = %s Location.wrap@.@." PP.comment "Entry point" l.entry_point ;
() ()
end end
@ -205,9 +220,9 @@ module Print_Grammar = struct
let i = ref 0 in let i = ref 0 in
let aux : _ -> O.rhs_element -> _ = fun ppf e -> let aux : _ -> O.rhs_element -> _ = fun ppf e ->
(match e with (match e with
| `Named s -> fprintf ppf "%s = %s" letters.(!i) s | `Named s -> fprintf ppf "%s = wrap(%s)" letters.(!i) s
| `List (mode, sep, s) -> | `List (mode, sep, s) ->
fprintf ppf "%s = %s(%s, %s)" fprintf ppf "%s = %s(%s, wrap(%s))"
letters.(!i) letters.(!i)
(match mode with | `Lead -> "lead_list" | `Trail -> "trail_list" | `Separator -> "separated_list") (match mode with | `Lead -> "lead_list" | `Trail -> "trail_list" | `Separator -> "separated_list")
(Token.to_string sep) (Token.to_string sep)
@ -225,7 +240,7 @@ module Print_Grammar = struct
i := !i + 1 ; s i := !i + 1 ; s
in in
let content = List.filter_map aux rhs in let content = List.filter_map aux rhs in
fprintf ppf "%a" PP.(list_sep string (const " , ")) content fprintf ppf "%s (%a)" (String.capitalize_ascii gr.name) PP.(list_sep string (const " , ")) content
in in
let aux : _ -> O.rhs -> _ = fun ppf rhs -> let aux : _ -> O.rhs -> _ = fun ppf rhs ->
fprintf ppf "| %a { %a }" fprintf ppf "| %a { %a }"
@ -353,7 +368,7 @@ module Expression = struct
let arith_variable : O.n_operator = make_name "Arith_variable" [ `Named "variable" ] let arith_variable : O.n_operator = make_name "Arith_variable" [ `Named "variable" ]
let arith = O.name_hierarchy "arith" [ let arith = O.name_hierarchy "expression" [
[let_in] ; [let_in] ;
[addition ; substraction] ; [addition ; substraction] ;
[multiplication ; division] ; [multiplication ; division] ;
@ -377,9 +392,11 @@ module Program = struct
[`Token CONST ; `Named variable_name ; `Token EQUAL ; `Named expression_name] [`Token CONST ; `Named variable_name ; `Token EQUAL ; `Named expression_name]
] ]
let singletons = List.map O.rule_singleton [program ; statement]
end end
let language = O.language "arith" [variable] [Expression.arith] let language = O.language program_name (variable :: Program.singletons) [Expression.arith]
let () = let () =
let argn = Array.length Sys.argv in let argn = Array.length Sys.argv in

View File

@ -19,28 +19,24 @@
(targets token.mly) (targets token.mly)
(deps generator.exe) (deps generator.exe)
(action (system "./generator.exe mly > token.mly")) (action (system "./generator.exe mly > token.mly"))
(mode promote-until-clean)
) )
(rule (rule
(targets token.ml) (targets token.ml)
(deps generator.exe) (deps generator.exe)
(action (system "./generator.exe ml > token.ml")) (action (system "./generator.exe ml > token.ml"))
(mode promote-until-clean)
) )
(rule (rule
(targets lexer.mll) (targets lexer.mll)
(deps generator.exe) (deps generator.exe)
(action (system "./generator.exe mll > lexer.mll")) (action (system "./generator.exe mll > lexer.mll"))
(mode promote-until-clean)
) )
(rule (rule
(targets token_type.ml token_type.mli) (targets token_type.ml token_type.mli)
(deps token.mly) (deps token.mly)
(action (system "menhir --only-tokens token.mly --base token_type")) (action (system "menhir --only-tokens token.mly --base token_type"))
(mode promote-until-clean)
) )
(alias (alias
@ -52,5 +48,4 @@
(targets lexer.ml) (targets lexer.ml)
(deps token.ml lexer.mll) (deps token.ml lexer.mll)
(action (system "ocamllex lexer.mll")) (action (system "ocamllex lexer.mll"))
(mode promote-until-clean)
) )