Sebastian Ullrich
468ac814a7
perf(library/init/lean/parser/token): move number' out of longest_match call
2018-09-14 16:33:04 -07:00
Sebastian Ullrich
123adc1ae2
fix(library/init/lean/parser/parsec): longest_match: do not consume if no parser consumed
2018-09-14 16:33:04 -07:00
Sebastian Ullrich
384389c84b
refactor(library/init/lean/parser/basic): move out rec_t and trie
2018-09-14 16:33:04 -07:00
Sebastian Ullrich
6733d5ab21
feat(library/init/lean/parser/token): comments are not tokens anymore
2018-09-14 16:33:04 -07:00
Sebastian Ullrich
e6b5598d7b
chore(library/init/lean/parser/term): actually remove Type*
2018-09-13 16:38:40 -07:00
Sebastian Ullrich
ce5618d332
chore(library/init/lean/parser/term): remove Sort*, Type*
...
These can be macros
2018-09-13 16:38:40 -07:00
Sebastian Ullrich
98e09c274f
feat(library/init/lean/parser/{pratt,level}): factor out pratt combinator, implement level parsers
2018-09-13 16:38:40 -07:00
Sebastian Ullrich
a57573a5b7
fix(library/init/lean/parser/command): keywords in notation actions are not actual keywords
2018-09-13 16:38:40 -07:00
Leonardo de Moura
afd54039ab
chore(library): remove >>, we should use *>
2018-09-12 17:31:21 -07:00
Leonardo de Moura
9e305a5f26
chore(library): remove return, we should use pure
2018-09-12 16:51:11 -07:00
Sebastian Ullrich
af55cb13e7
fix(library/messages,library/init/lean/message): wrap message_log in structure, reverse in the end
2018-09-11 13:55:25 -07:00
Sebastian Ullrich
99ab0e9d67
refactor(library/messages): make an object_ref
2018-09-11 13:55:25 -07:00
Leonardo de Moura
0691d43153
feat(library/init/lean/parser/basic): define trie using rbnode (char × trie) nested inductice type
2018-09-09 18:19:28 -07:00
Sebastian Ullrich
0d865b37dd
feat(library/init/lean/{message,parser}): enhance lean.message
...
Small regression: order of messages flipped, should eventually be sorted by
position
2018-09-08 18:37:58 -07:00
Sebastian Ullrich
387cd25942
feat(library/init/lean/parser/term): implement Pratt parser
2018-09-06 17:17:50 -07:00
Sebastian Ullrich
c7d8271c84
feat(library/init/lean/parser/token): save lbp in token_config
2018-09-06 17:16:57 -07:00
Sebastian Ullrich
1a53d4444b
feat(library/init/lean/parser): parameterize recursive term parser with rbp
2018-09-06 17:16:22 -07:00
Sebastian Ullrich
149dd2a5e3
refactor(library/init/lean/parser): move command parsers into separate file
2018-09-06 10:46:29 -07:00
Sebastian Ullrich
d4105e1e16
chore(library/init/lean/parser/basic): avoid nesting rbnode in trie
...
The new two-layer rbnode/list structure is a little faster
2018-09-05 10:37:03 -07:00
Sebastian Ullrich
9c96aec3dc
perf(library/init/lean/parser/parsec): inline pure, bind, and left_over
2018-09-05 09:58:49 -07:00
Sebastian Ullrich
66ebd5d7d6
feat(library/init/lean/parser): implement new tokenizer using trie
...
test execution went down from 3.5s to 1.5s
2018-09-04 14:06:43 -07:00
Sebastian Ullrich
93d13ffea3
chore(library/init/lean): lean.parser.reader ~> lean.parser
2018-08-30 16:34:47 -07:00
Sebastian Ullrich
d60e3a66ce
refactor(library/init/lean/parser/reader): make monad stack not reducible
2018-08-30 15:59:38 -07:00
Sebastian Ullrich
de9d894c14
feat(library/init/lean/parser/reader): use coroutine on the module level
2018-08-29 16:42:24 -07:00
Sebastian Ullrich
2528aee72b
refactor(library/init/lean/parser/reader): use different monad stacks for different parts of the reader
2018-08-29 16:42:24 -07:00
Sebastian Ullrich
cec1ee2564
feat(library/init/lean/parser/parsec): reintroduce parsec_t
2018-08-29 16:42:24 -07:00
Sebastian Ullrich
a178f181a8
chore(library/init/lean/parser/macro): remove old name resolution prototype
2018-08-28 13:13:14 -07:00
Sebastian Ullrich
46f734b1b1
refactor(library/init/lean/parser/reader): replace macro with syntax_node_kind
...
Also make sure that the name inside a node kind is the full name of the
declaration. This way, we cannot have accidentally conflicting node kind names.
2018-08-28 13:13:14 -07:00
Sebastian Ullrich
61f8ebf4ef
refactor(library/init/lean/parser/reader): destructure reader into monad and has_tokens typeclass
2018-08-23 10:38:59 -07:00
Sebastian Ullrich
762259a96f
chore(library/init/lean/parser/reader): cleanup
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
287fdce45b
refactor(library/init/lean/parser/reader): remove reader.has_view default instance
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
c69cc61292
feat(frontends/lean,library/init/lean/parser/reader/module): add node_choice! macro
...
Creates an inductive type from an ordered choice reader
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
1b8e74123c
feat(frontends/lean/{builtin_exprs,elaborator}): special-case try inside of node!
2018-08-22 14:32:03 -07:00
Sebastian Ullrich
26d696a937
feat(frontends/lean,library/init/lean/parser/reader/module): basic node! macro
2018-08-22 14:32:03 -07:00
Leonardo de Moura
261dc999d0
refactor(frontends/lean/elaborator): mark thunk as opaque, and thunk A to A is now a coercion
...
@kha I was working in the new declaration type and using tasks there.
Since we don't have tasks yet in Lean, I decided to start refactoring
the `thunk` type. I defined it as:
```
-- TODO(Leo): mark as opaque, it is implemented by the new runtime
structure thunk (α : Type u) : Type u :=
(fn : unit → α)
def thunk.pure {α : Type u} (a : α) : thunk α :=
⟨λ _, a⟩
def thunk.get {α : Type u} (t : thunk α) : α :=
t.fn ()
```
The idea is to use the runtime primitives to implement them.
Then, I realized the support for `thunk`s in the elaborator are quite
hacky. Given `f x`, if `f`'s domain has type `thunk A`, we elaborate
`f x` as `f (fun _, x)` even if `x` has type `thunk A`.
This is quite bad, for example, suppose we have
```
def f (x : thunk A) := ...
```
Then, the following definition is type incorrect.
```
def g (x : thunk A) := f x
```
and we are forced to write
```
def g (x : thunk A) := f (x ())
```
The term `f (x ())` will be elaborated as `f (fun _, x ())` and an
unnecessary closure is created at runtime.
This mechanism inherited from Lean 3 is also incompatible with the
new thunk definition. Given `x : thunk A`, I want to write `x.get`
to retrieve the value instead of `x ()` as in Lean 3.
However, `x.get` expands into the nonsensical `(fun _, x).get`.
So, I decided to view the mapping `A` to `thunk A` as a "coercion".
I used double quotes, because it is a macro instead of a function.
If it were a coercion, then we would be using `thunk.pure` to coerce
values but this is not we want most of the time.
For example, given `f : thunk A -> B` and a term `t : A`, when we write
`f t`, we want it to be converted into `f (fun _, t)` instead of
`f (thunk.pure t)` which would eagerly compute `t`. The transformation
`t` into `fun _, t` is syntactic.
We cannot implement it using type classes. I implemented it as
a hard-coded extra case like the one from `Prop` to `bool`.
We can also add a coercion from `thunk A` to `A` to avoid the `.get`.
That being said, I had a few breakages in the code base since we only
use coercions when the given and expected type do not contain
metavariables.
2018-08-21 15:27:51 -07:00
Sebastian Ullrich
6b55e24ab7
feat(library/init/{io,control/except}): use lift_t to automatically upcast io and other errors
2018-08-21 08:43:09 -07:00
Sebastian Ullrich
ba7d3ee178
refactor(library/init/lean/parser/{reader/module,syntax}): move new coercions
2018-08-06 15:05:41 -07:00
Sebastian Ullrich
bf043ab8bd
feat(library/init/lean/parser/reader/basic): first has_view prototype, plus prefix ~> notation expansion based on it
2018-08-02 20:35:15 -07:00
Sebastian Ullrich
f52395140a
feat(library/init/lean/parser/parsec): add dbg helper combinator
2018-08-02 13:32:42 -07:00
Sebastian Ullrich
1e1bf4b0f8
feat(library/init/lean/parser/reader/basic): add explicit syntax.missing objects on error
2018-08-02 13:32:28 -07:00
Sebastian Ullrich
eda9e4bb3f
feat(library/derive_attribute): temporary, hacky C++ implementation of @[derive]
2018-08-01 18:44:23 -07:00
Sebastian Ullrich
3951db3b0b
fix(library/init/lean/parser/reader/basic): error recovery reprint issue
2018-07-30 17:55:17 -07:00
Sebastian Ullrich
87dc8adbe6
fix(library/init/lean/parser/parsec): monad_except.catch should not reset position, consumed flag
2018-07-30 17:50:37 -07:00
Sebastian Ullrich
8666047703
feat(library/init/lean/parser/reader/module): reserve, mixfix, universe commands
2018-07-30 17:30:20 -07:00
Sebastian Ullrich
242d63af25
fix(library/init/lean/parser/reader/basic): store token start position for perfect roundtripping
2018-07-30 17:30:20 -07:00
Sebastian Ullrich
312de57aec
test(tests/lean/reader1): test error recovery and fix bug
2018-07-30 17:30:20 -07:00
Sebastian Ullrich
0fd9d29ba2
feat(library/init/lean/parser/reader/module): command-level error recovery
2018-07-30 10:38:00 -07:00
Sebastian Ullrich
3728b2ba3f
feat(library/init/lean/parser/reader/basic): add error list handling
2018-07-30 10:38:00 -07:00
Sebastian Ullrich
e34f2e8cd7
chore(library/init/lean/parser): improve error messages
2018-07-30 10:38:00 -07:00
Sebastian Ullrich
2823bebd23
refactor(library/init/lean/parser/parsec): message.pos: replace with iterator
...
This allows efficient recovery from a parse error as well as implementing
`has_to_string` for `message`
2018-07-30 10:38:00 -07:00