lean4-htt/library/init/lean/parser/syntax.lean

94 lines
2.6 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Sebastian Ullrich
-/
prelude
import init.lean.name init.lean.parser.parser_t
namespace lean
namespace parser
/-- De Bruijn index relative to surrounding 'bind' macros -/
@[reducible] def var_offset :=
@[reducible] def macro_scope_id :=
structure span :=
(left : position)
(right : position)
structure resolved :=
-- local or (overloaded) global
(decl : var_offset ⊕ list name)
/- prefix of the reference that corresponds to the decl. All trailing name components
are field accesses. -/
(«prefix» : name)
instance resolved.has_to_format : has_to_format resolved := ⟨λ r, to_fmt (r.decl, r.prefix)⟩
structure syntax_ident :=
(span : option span) (name : name) (msc : option macro_scope_id) (res : option resolved)
inductive atomic_val
| string (s : string)
| number (n : nat)
| name (n : name)
structure syntax_atom :=
(span : option span) (val : atomic_val)
structure syntax_node (syntax : Type) :=
(macro : name) (args : list syntax)
inductive syntax
| ident (val : syntax_ident)
/- any non-ident atom -/
| atom (val : syntax_atom)
| node (val : syntax_node syntax)
namespace syntax
open format
protected def span : syntax → option span
| (ident val) := val.span
| (atom val) := val.span
| (node val) := none -- should perhaps be the 'join' of all sub-spans?
protected mutual def to_format, to_format_lst
with to_format : syntax → format
| (ident id) :=
let n :=
to_fmt id.name ++
(match id.msc with
| some msc := "!" ++ to_fmt msc
| none := "") ++
(match id.res with
| some res :=
":" ++
(match res.decl with
| sum.inl idx := to_fmt idx
| sum.inr [n] := to_fmt n
| sum.inr ns := to_fmt ns)
++ if res.prefix = id.name then
to_fmt ""
else
to_fmt ".(" ++ to_fmt (id.name.replace_prefix res.prefix name.anonymous) ++ ")"
| none := "") in
n
| (atom ⟨_, atomic_val.string s⟩) := to_fmt $ repr s
| (atom ⟨_, atomic_val.number n⟩) := to_fmt n
| (atom ⟨_, atomic_val.name n⟩) := to_fmt "`" ++ to_fmt n
| (node {macro := name.anonymous, args := args, ..}) :=
sbracket $ join_sep (to_format_lst args) line
| (node {macro := n, args := args, ..}) :=
paren $ join_sep (to_fmt n :: to_format_lst args) line
with to_format_lst : list syntax → list format
| [] := []
| (s::ss) := to_format s :: to_format_lst ss
end syntax
instance : has_to_format syntax := ⟨syntax.to_format⟩
instance : has_to_string syntax := ⟨to_string ∘ to_fmt⟩
end parser
end lean