60 lines
1.7 KiB
Text
60 lines
1.7 KiB
Text
import init.lean.parser.reader.module init.io
|
|
open lean.parser
|
|
open lean.parser.reader
|
|
|
|
def show_result (p : lean.parser.reader) [has_tokens p] (s : string) : eio unit :=
|
|
let (stx, errors) := p.parse ⟨⟩ s in
|
|
when (stx.reprint ≠ s) (
|
|
io.println "reprint fail:" *>
|
|
io.println stx.reprint
|
|
) *>
|
|
match errors with
|
|
| [] := do
|
|
io.println "result: ",
|
|
io.println (to_string stx)
|
|
| _ := do
|
|
errors.mfor $ λ e, io.println e,
|
|
io.println "partial syntax tree:",
|
|
io.println (to_string stx)
|
|
|
|
#eval show_result module.reader "prelude"
|
|
#eval show_result module.reader "import me"
|
|
#eval show_result module.reader "importme"
|
|
#eval show_result module.reader "import"
|
|
|
|
#eval show_result module.reader "prelude
|
|
import ..a b
|
|
import c"
|
|
|
|
#eval show_result module.reader "open me you"
|
|
#eval show_result module.reader "open me as you (a b c) (renaming a->b c->d) (hiding a b)"
|
|
#eval show_result module.reader "open me you."
|
|
#eval show_result module.reader "open open"
|
|
#eval show_result module.reader "open me import open you"
|
|
|
|
#eval show_result module.reader "open a
|
|
section b
|
|
open c
|
|
section d
|
|
open e
|
|
end d
|
|
end b"
|
|
|
|
-- should not be a reader error
|
|
#eval show_result module.reader "section a end"
|
|
|
|
#eval show_result module.reader "notation `Prop` := _"
|
|
|
|
#eval show_result mixfix.reader "prefix `+`:10 := _"
|
|
#eval (do {
|
|
let (stx, _) := mixfix.reader.parse ⟨⟩ "prefix `+`:10 := _",
|
|
some {root := stx, ..} ← pure $ reader.parse.view stx,
|
|
some stx ← pure $ mixfix.expand stx | throw "expand fail",
|
|
io.println stx,
|
|
io.println stx.reprint
|
|
} : except_t string io unit)
|
|
|
|
-- slowly progressing...
|
|
#eval do
|
|
s ← io.fs.read_file "../../library/init/core.lean",
|
|
show_result module.reader $ (s.mk_iterator.nextn 1700).prev_to_string
|