refactor: uniform precedence representation

This commit is contained in:
Leonardo de Moura 2020-01-15 17:54:48 -08:00
parent cbf57fa388
commit e48908aea1
2 changed files with 24 additions and 25 deletions

View file

@ -97,25 +97,6 @@ def openSimple := parser! many1 ident
@[builtinCommandParser] def «open» := parser! "open " >> (openHiding <|> openRenaming <|> openOnly <|> openSimple)
@[builtinCommandParser] def syntaxCat := parser! "declare_syntax_cat " >> ident
/- Lean3 command declaration commands -/
def maxPrec := parser! nonReservedSymbol "max"
def precedenceLit : Parser := numLit <|> maxPrec
def «precedence» := parser! " : " >> precedenceLit
def quotedSymbolPrec := parser! quotedSymbol >> optional «precedence»
def «prefix» := parser! "prefix"
def «infix» := parser! "infix"
def «infixl» := parser! "infixl"
def «infixr» := parser! "infixr"
def «postfix» := parser! "postfix"
def mixfixKind := «prefix» <|> «infix» <|> «infixl» <|> «infixr» <|> «postfix»
@[builtinCommandParser] def «reserve» := parser! "reserve " >> mixfixKind >> quotedSymbolPrec
def mixfixSymbol := quotedSymbolPrec <|> unquotedSymbol
@[builtinCommandParser] def «mixfix» := parser! mixfixKind >> mixfixSymbol >> " := " >> termParser
def strLitPrec := parser! strLit >> optional «precedence»
def identPrec := parser! ident >> optional «precedence»
@[builtinCommandParser] def «notation» := parser! "notation" >> many (strLitPrec <|> quotedSymbolPrec <|> identPrec) >> " := " >> termParser
@[builtinCommandParser] def «macro» := parser! "macro" >> many1Indent Term.matchAlt "'match' alternatives must be indented"
end Command
end Parser
end Lean

View file

@ -17,10 +17,12 @@ registerBuiltinParserAttribute `builtinSyntaxParser `syntax leadingIdentAsSymbol
categoryParser `syntax rbp
namespace Syntax
def maxPrec := parser! nonReservedSymbol "max"
def precedenceLit : Parser := numLit <|> maxPrec
def «precedence» := parser! " : " >> precedenceLit
@[builtinSyntaxParser] def paren := parser! "(" >> many1 syntaxParser >> ")"
@[builtinSyntaxParser] def cat := parser! ident >> optional (try (":" >> numLit))
@[builtinSyntaxParser] def atom := parser! strLit >> optional (try (":" >> numLit))
@[builtinSyntaxParser] def cat := parser! ident >> optional «precedence»
@[builtinSyntaxParser] def atom := parser! strLit >> optional «precedence»
@[builtinSyntaxParser] def num := parser! nonReservedSymbol "num"
@[builtinSyntaxParser] def str := parser! nonReservedSymbol "str"
@[builtinSyntaxParser] def char := parser! nonReservedSymbol "char"
@ -31,14 +33,30 @@ namespace Syntax
@[builtinSyntaxParser] def sepBy := parser! nonReservedSymbol "sepBy " >> syntaxParser >> syntaxParser
@[builtinSyntaxParser] def sepBy1 := parser! nonReservedSymbol "sepBy1 " >> syntaxParser >> syntaxParser
@[builtinSyntaxParser] def many := tparser! pushLeading >> symbolAux "*" none
@[builtinSyntaxParser] def many1 := tparser! pushLeading >> symbolAux "+" none
@[builtinSyntaxParser] def orelse := tparser! pushLeading >> " <|> " >> syntaxParser 1
@[builtinSyntaxParser] def many := tparser! pushLeading >> symbolAux "*" none
@[builtinSyntaxParser] def many1 := tparser! pushLeading >> symbolAux "+" none
@[builtinSyntaxParser] def orelse := tparser! pushLeading >> " <|> " >> syntaxParser 1
end Syntax
namespace Command
def quotedSymbolPrec := parser! quotedSymbol >> optional Syntax.precedence
def «prefix» := parser! "prefix"
def «infix» := parser! "infix"
def «infixl» := parser! "infixl"
def «infixr» := parser! "infixr"
def «postfix» := parser! "postfix"
def mixfixKind := «prefix» <|> «infix» <|> «infixl» <|> «infixr» <|> «postfix»
-- TODO delete reserve
@[builtinCommandParser] def «reserve» := parser! "reserve " >> mixfixKind >> quotedSymbolPrec
def mixfixSymbol := quotedSymbolPrec <|> unquotedSymbol
@[builtinCommandParser] def «mixfix» := parser! mixfixKind >> mixfixSymbol >> " := " >> termParser
def strLitPrec := parser! strLit >> optional Syntax.precedence
def identPrec := parser! ident >> optional Syntax.precedence
@[builtinCommandParser] def «notation» := parser! "notation" >> many (strLitPrec <|> quotedSymbolPrec <|> identPrec) >> " := " >> termParser
@[builtinCommandParser] def «macro» := parser! "macro" >> many1Indent Term.matchAlt "'match' alternatives must be indented"
@[builtinCommandParser] def «syntax» := parser! "syntax " >> optional ("[" >> ident >> "]") >> many1 syntaxParser >> " : " >> ident
end Command