···11+(** Rego AST.
22+33+ From the OPA Policy Reference grammar. *)
44+55+type span = { offset : int; line : int; col : int; len : int }
66+(** Source location for error reporting. *)
77+88+val dummy_span : span
99+(** [dummy_span] is the empty source location. *)
1010+1111+(** {1 Operators} *)
1212+1313+type arith_op = Add | Sub | Mul | Div | Mod
1414+type bool_op = Lt | Le | Eq | Ge | Gt | Ne
1515+type bin_op = Intersection | Union
1616+type assign_op = Assign | ColonEq
1717+1818+(** {1 Expressions} *)
1919+2020+type expr =
2121+ | Null of span
2222+ | Bool of span * bool
2323+ | Number of span * float
2424+ | String of span * string
2525+ | RawString of span * string
2626+ | Var of span * string
2727+ | Array of span * expr list
2828+ | Set of span * expr list
2929+ | Object of span * (expr * expr) list
3030+ | ArrayCompr of span * expr * query
3131+ | SetCompr of span * expr * query
3232+ | ObjectCompr of span * expr * expr * query
3333+ | Call of span * expr * expr list
3434+ | UnaryExpr of span * expr
3535+ | RefDot of span * expr * string
3636+ | RefBrack of span * expr * expr
3737+ | ArithExpr of span * arith_op * expr * expr
3838+ | BoolExpr of span * bool_op * expr * expr
3939+ | BinExpr of span * bin_op * expr * expr
4040+ | AssignExpr of span * assign_op * expr * expr
4141+ | Membership of span * expr option * expr * expr
4242+4343+and literal =
4444+ | SomeVars of span * string list
4545+ | SomeIn of span * expr option * expr * expr
4646+ | Expr of span * expr
4747+ | NotExpr of span * expr
4848+ | Every of span * string option * string * expr * query
4949+5050+and with_modifier = { wm_span : span; wm_ref : expr; wm_as : expr }
5151+5252+and literal_stmt = {
5353+ ls_span : span;
5454+ ls_literal : literal;
5555+ ls_with_mods : with_modifier list;
5656+}
5757+5858+and query = { q_span : span; q_stmts : literal_stmt list }
5959+6060+type rule_assign = { ra_span : span; ra_op : assign_op; ra_value : expr }
6161+6262+type rule_body = {
6363+ rb_span : span;
6464+ rb_assign : rule_assign option;
6565+ rb_query : query;
6666+}
6767+6868+type rule_head =
6969+ | RuleHeadCompr of span * expr * rule_assign option
7070+ | RuleHeadSet of span * expr * expr option
7171+ | RuleHeadFunc of span * expr * expr list * rule_assign option
7272+7373+type rule =
7474+ | RuleSpec of span * rule_head * rule_body list
7575+ | RuleDefault of span * expr * expr list * assign_op * expr
7676+7777+type import = { imp_span : span; imp_ref : expr; imp_as : string option }
7878+type package = { pkg_span : span; pkg_ref : expr }
7979+8080+type rego_module = {
8181+ mod_package : package;
8282+ mod_imports : import list;
8383+ mod_rules : rule list;
8484+}
8585+8686+(** {1 Pretty-printers} *)
8787+8888+val pp_arith_op : arith_op Fmt.t
8989+(** [pp_arith_op] formats an arithmetic operator. *)
9090+9191+val pp_bool_op : bool_op Fmt.t
9292+(** [pp_bool_op] formats a boolean operator. *)
9393+9494+val pp_bin_op : bin_op Fmt.t
9595+(** [pp_bin_op] formats a binary set operator. *)
9696+9797+val pp_assign_op : assign_op Fmt.t
9898+(** [pp_assign_op] formats an assignment operator. *)
9999+100100+val pp_span : span Fmt.t
101101+(** [pp_span] formats a source span as [line:col]. *)
+1
lib/lexer.ml
···9696type state = { lexbuf : Sedlexing.lexbuf; mutable prev : Parser.token }
97979898let v src = { lexbuf = Sedlexing.Utf8.from_string src; prev = Parser.EOF }
9999+let positions st = Sedlexing.lexing_positions st.lexbuf
99100100101let rec raw_token lexbuf =
101102 match%sedlex lexbuf with
+17
lib/lexer.mli
···11+(** Rego lexer using sedlex. *)
22+33+exception Error of string
44+(** Raised on unrecognized input. *)
55+66+type state
77+(** Lexer state, threading through the previous token for automatic
88+ semicolon insertion. *)
99+1010+val v : string -> state
1111+(** [v src] creates a fresh lexer state from a source string. *)
1212+1313+val token : state -> Parser.token
1414+(** [token st] returns the next token. *)
1515+1616+val positions : state -> Lexing.position * Lexing.position
1717+(** [positions st] returns the start and end positions of the current token. *)
+1-1
lib/rego.ml
···4444 let st = Lexer.v source in
4545 fun () ->
4646 let tok = Lexer.token st in
4747- let start_p, end_p = Sedlexing.lexing_positions st.lexbuf in
4747+ let start_p, end_p = Lexer.positions st in
4848 (tok, start_p, end_p)
49495050let parse_module source =