86 lines
2.4 KiB
Text
86 lines
2.4 KiB
Text
/-
|
||
Copyright (c) 2020 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
|
||
Notation for operators defined at Prelude.lean
|
||
-/
|
||
prelude
|
||
import Init.Prelude
|
||
|
||
infixr:90 " ∘ " => Function.comp
|
||
infixr:35 " × " => Prod
|
||
|
||
infixl:65 " + " => Add.add
|
||
infixl:65 " - " => Sub.sub
|
||
infixl:70 " * " => Mul.mul
|
||
infixl:70 " / " => Div.div
|
||
infixl:70 " % " => Mod.mod
|
||
infixl:70 " %ₙ " => ModN.modn
|
||
infixr:80 " ^ " => Pow.pow
|
||
|
||
infix:50 " ≤ " => HasLessEq.LessEq
|
||
infix:50 " <= " => HasLessEq.LessEq
|
||
infix:50 " < " => HasLess.Less
|
||
infix:50 " ≥ " => GreaterEq
|
||
infix:50 " >= " => GreaterEq
|
||
infix:50 " > " => Greater
|
||
infix:50 " = " => Eq
|
||
infix:50 " == " => BEq.beq
|
||
infix:50 " ~= " => HEq
|
||
infix:50 " ≅ " => HEq
|
||
|
||
infixr:35 " ∧ " => And
|
||
infixr:35 " /\\ " => And
|
||
infixr:30 " ∨ " => Or
|
||
infixr:30 " \\/ " => Or
|
||
|
||
infixl:35 " && " => and
|
||
infixl:30 " || " => or
|
||
|
||
infixl:65 " ++ " => Append.append
|
||
infixr:67 " :: " => List.cons
|
||
|
||
infixr:2 " <|> " => OrElse.orElse
|
||
infixr:60 " >> " => AndThen.andThen
|
||
infixl:55 " >>= " => Bind.bind
|
||
infixl:60 " <*> " => Seq.seq
|
||
infixl:60 " <* " => SeqLeft.seqLeft
|
||
infixr:60 " *> " => SeqRight.seqRight
|
||
infixr:100 " <$> " => Functor.map
|
||
|
||
-- Basic notation for defining parsers
|
||
syntax stx "+" : stx
|
||
syntax stx "*" : stx
|
||
syntax stx "?" : stx
|
||
syntax:2 stx " <|> " stx:1 : stx
|
||
|
||
macro_rules
|
||
| `(stx| $p +) => `(stx| many1($p))
|
||
| `(stx| $p *) => `(stx| many($p))
|
||
| `(stx| $p ?) => `(stx| optional($p))
|
||
| `(stx| $p₁ <|> $p₂) => `(stx| orelse($p₁, $p₂))
|
||
|
||
macro "if" h:ident " : " c:term " then " t:term " else " e:term : term =>
|
||
`(dite $c (fun $h => $t) (fun $h => $e))
|
||
|
||
macro "if" c:term " then " t:term " else " e:term : term =>
|
||
`(ite $c $t $e)
|
||
|
||
syntax "[" sepBy(term, ", ") "]" : term
|
||
|
||
open Lean in
|
||
macro_rules
|
||
| `([ $elems* ]) => do
|
||
let rec expandListLit (i : Nat) (skip : Bool) (result : Syntax) : MacroM Syntax := do
|
||
match i, skip with
|
||
| 0, _ => pure result
|
||
| i+1, true => expandListLit i false result
|
||
| i+1, false => expandListLit i true (← `(List.cons $(elems[i]) $result))
|
||
expandListLit elems.size false (← `(List.nil))
|
||
|
||
syntax "{ " ident (" : " term)? " // " term " }" : term
|
||
|
||
macro_rules
|
||
| `({ $x : $type // $p }) => `(Subtype (fun ($x:ident : $type) => $p))
|
||
| `({ $x // $p }) => `(Subtype (fun ($x:ident : _) => $p))
|