package lua_parser

  1. Overview
  2. Docs
A Lua 5.2 Parser

Install

Dune Dependency

Authors

Maintainers

Sources

1.0.2.tar.gz
md5=35b1a3c607a0e23f81322f4b99b11d13
sha512=ed3995928aaf87d68114a9d5bee1ca5b41dd359134589ef6eba4ea2cc5b41a78bc4ac35603301dc1bd29260a0908c6142fabf689a7a7d8b76a3abf8ecdbd9194

doc/src/lua_parser.lib/pp_lua.ml.html

Source file pp_lua.ml

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(*
 The MIT License                                                                                                                                 
                                                                                                                                                 
 Copyright (c) 2020 Jason D. Nielsen <drjdnielsen@gmail.com>
 *)

open Ast

let rec repeat s n =
  match n with
  | 0 -> ""
  | 1 -> s
  | _ -> s ^ repeat s (n - 1)

let count = ref 0

let indent () = count := !count + 3

let dedent () = count := !count - 3

let ws () = repeat " " !count

let add_nl str =
  str ^ "\n" 

let rec pp = function
  | Break -> "break"
  | Bool str -> str
  | Ellipsis -> "..."
  | Ident str -> str
  | Number str -> str
  | String str -> str
  | Binop(str, ex1, ex2) -> pp ex1 ^ " " ^ str ^ " " ^ pp ex2
  | Unop(str, ex) -> str ^ pp ex
  | Args lex -> "(" ^ pp lex ^ ")"
  | Assign(ex1, ex2) -> pp ex1 ^ " = " ^ pp ex2
  | Do ex -> "do" ^ pp_block ex false
  | Elseif(ex1, ex2) -> "elseif " ^ pp ex1 ^ " then" ^ pp_block ex2 true
  | Fassign(ex1, ex2) -> "[" ^ pp ex1 ^ "]" ^ " = " ^ pp ex2
  | Fbody(ex1, ex2) -> "(" ^ pp ex1 ^ ")" ^ pp_block ex2 false
  | Forin(ex1, ex2, ex3) -> "for " ^ pp ex1 ^ " in " ^ pp ex2 ^ " do" ^ pp_block ex3 false
  | For1(ex1, ex2, ex3, ex4) -> pp_for1 ex1 ex2 ex3 ex4
  | For2(ex1, ex2, ex3, ex4, ex5) -> pp_for2 ex1 ex2 ex3 ex4 ex5
  | Function(ex1, ex2) -> "function " ^ pp ex1 ^ pp ex2
  | FunctionE ex -> "function" ^ pp ex
  | Goto ex -> "goto " ^ pp ex
  | If1(ex1, ex2) -> "if " ^ pp ex1 ^ " then" ^ pp_block ex2 false
  | If2(ex1, ex2, ex3) -> pp_if2 ex1 ex2 ex3
  | If3(ex1, ex2, ex3) -> pp_if3 ex1 ex2 ex3
  | If4(ex1, ex2, ex3, ex4) -> pp_if4 ex1 ex2 ex3 ex4
  | Key1 ex -> "[" ^ pp ex ^ "]"
  | Key2 ex -> "." ^ pp ex
  | Label ex1 -> "::" ^ pp ex1 ^ "::"
  | Lassign(ex1, ex2) -> "local " ^ pp ex1 ^ " = " ^ pp ex2
  | Lnames ex -> "local " ^ pp ex
  | Lfunction(ex1, ex2) -> "local function " ^ pp ex1 ^ pp ex2
  | Member(ex1, ex2) -> pp ex1 ^ ":" ^ pp ex2
  | Mcall(ex1, ex2, ex3) -> pp ex1 ^ ":" ^ pp ex2 ^ pp ex3
  | Pexp ex -> "(" ^ pp ex ^ ")"
  | Repeat(ex1, ex2) -> "repeat" ^ pp_block ex1 true ^ "until " ^ pp ex2
  | Return ex -> "return " ^ pp ex
  | Table ex -> "{" ^ pp ex ^ "}"
  | Vargs ex -> pp ex ^ ", ..."
  | While(ex1, ex2) -> "while " ^ pp ex1 ^ " do" ^ pp_block ex2 false
  | Clist [] -> ""
  | Clist lex -> pp_clist lex
  | Elist [] -> ""
  | Elist lex -> pp_elist lex
  | FNlist [] -> ""
  | FNlist lex -> pp_fnlist lex
  | Slist [] -> ""
  | Slist lex -> pp_slist lex
and pp_block stl rpt =
  indent();
  let str = "\n" ^ ws () in
  let lex = extract_list stl in
  let out =
    if List.length lex > 0 then 
      let plex = List.map add_nl (List.map pp lex) in
      String.concat (ws ()) plex
    else "\n"
  in
  dedent ();
  let tl =
    match rpt with
    | false -> "end"
    | true -> ""
  in
  str ^ out ^ ws () ^ tl
and pp_slist lex =
  let plex = List.map add_nl (List.map pp lex) in
  ws () ^ String.concat (ws ()) plex
and pp_elist lex =
  let plex = List.map pp lex in
  String.concat ", " plex
and pp_clist lex =
  let plex = List.map pp lex in
  String.concat "" plex
and pp_fnlist lex =
  let plex = List.map pp lex in
  String.concat "." plex
and pp_if2 ex1 ex2 ex3 =
  "if " ^ pp ex1 ^ " then" ^ pp_block ex2 true ^ ws () ^ "else" ^ pp_block ex3 false
and pp_if3 ex1 ex2 ex3 =
  "if " ^ pp ex1 ^ " then" ^ pp_block ex2 true ^ "\n" ^ pp ex3 ^ ws () ^ "end"
and pp_if4 ex1 ex2 ex3 ex4 =
  "if " ^ pp ex1 ^ " then" ^ pp_block ex2 true ^ "\n" ^ pp ex3 ^ ws () ^ "else" ^ pp_block ex4 false
and pp_for1 ex1 ex2 ex3 ex4 =
  "for " ^ pp ex1 ^ " = " ^ pp ex2 ^ ", " ^ pp ex3 ^ " do" ^ pp_block ex4 false
and pp_for2 ex1 ex2 ex3 ex4 ex5 =
  "for " ^ pp ex1 ^ " = " ^ pp ex2 ^ ", " ^ pp ex3 ^ ", " ^ pp ex4 ^ " do" ^ pp_block ex5 false

let pp_lua ast = print_string (pp ast)

let pp_lua_str ast = pp ast
OCaml

Innovation. Community. Security.