lean4-htt/library/init/lean/parser/reader/basic.lean

71 lines
1.9 KiB
Text

/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Sebastian Ullrich
Reader for the Lean language
-/
prelude
import init.lean.parser.parser_t init.lean.parser.syntax init.lean.parser.macro
import init.lean.parser.identifier
namespace lean
-- TODO: enhance massively
def message := string
namespace parser
structure token_config :=
(«prefix» : string)
-- reading a token should not need any state
(token_reader : option (position → parser syntax) := none)
structure reader_state :=
(tokens : list token_config)
(fatal : bool)
(errors : list lean.message)
def reader_state.empty : reader_state :=
⟨[], ff, []⟩
structure reader_config := mk
@[irreducible] def reader := reader_t reader_config $ state_t reader_state $ parser
namespace reader
local attribute [reducible] reader
instance : monad reader := infer_instance
instance : alternative reader := infer_instance
instance : monad_reader reader_config reader := infer_instance
instance : monad_state reader_state reader := infer_instance
instance : monad_parser reader := infer_instance
protected def parse (cfg : reader_config) (st : reader_state) (s : string) (r : reader syntax) :
except parser.message syntax :=
prod.fst <$> ((r.run cfg).run st).parse_with_eoi s
end reader
namespace reader
open monad_parser
def node (m : macro) (ps : list (reader syntax)) : reader syntax :=
do args ← ps.mmap id,
pure $ syntax.node ⟨m.name, args⟩
def many (p : reader syntax) : reader syntax :=
do args ← many p,
pure $ syntax.node ⟨name.anonymous, args⟩
def many1 (p : reader syntax) : reader syntax :=
do args ← many1 p,
pure $ syntax.node ⟨name.anonymous, args⟩
def optional (p : reader syntax) : reader syntax :=
do r ← optional p,
pure $ match r with
| some r := syntax.node ⟨name.anonymous, [r]⟩
| none := syntax.node ⟨name.anonymous, []⟩
end reader
end parser
end lean