50 lines
1.6 KiB
Text
50 lines
1.6 KiB
Text
/-
|
|
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura, Sebastian Ullrich
|
|
-/
|
|
import Lean.Parser.Basic
|
|
|
|
namespace Lean
|
|
namespace Syntax
|
|
|
|
def manyToSepBy (stx : Syntax) (sepTk : String) : Syntax := do
|
|
match stx with
|
|
| node k args =>
|
|
if args.size == 0 then
|
|
stx
|
|
else
|
|
let mut argsNew := #[args[0]]
|
|
for i in [1:args.size] do
|
|
let arg := args[i]
|
|
let prev := argsNew.back
|
|
match prev.getTailInfo with
|
|
| some info =>
|
|
let prevArg := prev.setTailInfo { trailing := none }
|
|
argsNew := argsNew.set! (argsNew.size - 1) prev
|
|
argsNew := argsNew.push (atom info sepTk)
|
|
argsNew := argsNew.push arg
|
|
| none =>
|
|
argsNew := argsNew.push (atom {} sepTk)
|
|
argsNew := argsNew.push arg
|
|
node k argsNew
|
|
| stx => stx
|
|
|
|
def removeParen (stx : Syntax) : Syntax :=
|
|
stx.ifNodeKind `Lean.Parser.Term.paren
|
|
(fun stx =>
|
|
let body := stx.getArg 1
|
|
if body.getNumArgs != 2 then stx.val
|
|
else if (body.getArg 1).isNone then
|
|
let body := body.getArg 0
|
|
match stx.getArg 2, body.getTailInfo with
|
|
| atom { trailing := some outer } ")", some bodyInfo@{ trailing := some inner } =>
|
|
let bodyInfoTrail := inner.toString ++ " " -- add whithespaces for removed parentheses
|
|
let bodyInfoTrail := bodyInfoTrail ++ outer.toString -- add close paren trailing spaces
|
|
body.setTailInfo { bodyInfo with trailing := bodyInfoTrail.toSubstring }
|
|
| _, _ => stx.val
|
|
else stx.val)
|
|
(fun _ => stx)
|
|
|
|
end Syntax
|
|
end Lean
|