feat: add notFollowedByCategoryToken parser
This commit is contained in:
parent
3f4499be08
commit
3d6cc2de08
4 changed files with 32 additions and 9 deletions
|
|
@ -9,15 +9,6 @@ import Lean.Parser.Do
|
|||
namespace Lean
|
||||
namespace Parser
|
||||
|
||||
@[init] def regBuiltinCommandParserAttr : IO Unit :=
|
||||
registerBuiltinParserAttribute `builtinCommandParser `command
|
||||
|
||||
@[init] def regCommandParserAttribute : IO Unit :=
|
||||
registerBuiltinDynamicParserAttribute `commandParser `command
|
||||
|
||||
@[inline] def commandParser (rbp : Nat := 0) : Parser :=
|
||||
categoryParser `command rbp
|
||||
|
||||
/--
|
||||
Syntax quotation for terms and (lists of) commands. We prefer terms, so ambiguous quotations like
|
||||
`($x $y) will be parsed as an application, not two commands. Use `($x:command $y:command) instead.
|
||||
|
|
|
|||
|
|
@ -463,5 +463,35 @@ registerBuiltinParserAttribute `builtinTermParser `term
|
|||
@[init] def regTermParserAttribute : IO Unit :=
|
||||
registerBuiltinDynamicParserAttribute `termParser `term
|
||||
|
||||
-- declare `commandParser` to break cyclic dependency
|
||||
@[init] def regBuiltinCommandParserAttr : IO Unit :=
|
||||
registerBuiltinParserAttribute `builtinCommandParser `command
|
||||
|
||||
@[init] def regCommandParserAttribute : IO Unit :=
|
||||
registerBuiltinDynamicParserAttribute `commandParser `command
|
||||
|
||||
@[inline] def commandParser (rbp : Nat := 0) : Parser :=
|
||||
categoryParser `command rbp
|
||||
|
||||
def notFollowedByCategoryTokenFn (catName : Name) : ParserFn :=
|
||||
fun ctx s =>
|
||||
let categories := (parserExtension.getState ctx.env).categories;
|
||||
match getCategory categories catName with
|
||||
| none => s.mkUnexpectedError ("unknown parser category '" ++ toString catName ++ "'")
|
||||
| some cat =>
|
||||
let (s, stx) := peekToken ctx s;
|
||||
match stx with
|
||||
| some (Syntax.atom _ sym) =>
|
||||
match cat.tables.leadingTable.find? (mkNameSimple sym) with
|
||||
| some _ => s.mkError "notFollowedByCategoryToken"
|
||||
| _ => s
|
||||
| _ => s
|
||||
|
||||
@[inline] def notFollowedByCategoryToken (catName : Name) : Parser :=
|
||||
{ fn := notFollowedByCategoryTokenFn catName }
|
||||
|
||||
abbrev notFollowedByCommandToken : Parser :=
|
||||
notFollowedByCategoryToken `command
|
||||
|
||||
end Parser
|
||||
end Lean
|
||||
|
|
|
|||
|
|
@ -387,6 +387,7 @@ pushLine
|
|||
@[combinatorFormatter checkTailWs] def checkTailWs.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter checkColGe] def checkColGe.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter checkLineLe] def checkLineLe.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter notFollowedByCategoryToken] def notFollowedByCategoryToken.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter checkNoImmediateColon] def checkNoImmediateColon.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter Lean.Parser.checkInsideQuot] def checkInsideQuot.formatter : Formatter := pure ()
|
||||
@[combinatorFormatter Lean.Parser.checkOutsideQuot] def checkOutsideQuot.formatter : Formatter := pure ()
|
||||
|
|
|
|||
|
|
@ -447,6 +447,7 @@ p
|
|||
@[combinatorParenthesizer Lean.Parser.checkNoWsBefore] def checkNoWsBefore.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.checkTailWs] def checkTailWs.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.checkColGe] def checkColGe.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.notFollowedByCategoryToken] def notFollowedByCategoryToken.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.checkLineLe] def checkLineLe.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.checkNoImmediateColon] def checkNoImmediateColon.parenthesizer : Parenthesizer := pure ()
|
||||
@[combinatorParenthesizer Lean.Parser.checkInsideQuot] def checkInsideQuot.parenthesizer : Parenthesizer := pure ()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue