chore: lbp and rbp ==> prec

This commit is contained in:
Leonardo de Moura 2020-06-10 13:38:40 -07:00
parent f0a9e54a69
commit 6d3aff97d5
3 changed files with 23 additions and 23 deletions

View file

@ -397,7 +397,7 @@ def oldParseExpr (env : Environment) (input : String) (pos : String.Pos) : Excep
let c := Parser.mkParserContext env (Parser.mkInputContext input "<foo>");
let s := Parser.mkParserState c.input;
let s := s.setPos pos;
let s := (Parser.termParser Parser.appPrec : Parser.Parser).fn { c with rbp := Parser.appPrec } s;
let s := (Parser.termParser Parser.appPrec : Parser.Parser).fn { c with prec := Parser.appPrec } s;
let stx := s.stxStack.back;
match s.errorMsg with
| some errorMsg =>

View file

@ -126,7 +126,7 @@ instance InputContext.inhabited : Inhabited InputContext :=
⟨{ input := "", fileName := "", fileMap := arbitrary _ }⟩
structure ParserContext extends InputContext :=
(rbp : Nat)
(prec : Nat)
(left : Syntax := Syntax.missing)
(env : Environment)
(tokens : TokenTable)
@ -1082,10 +1082,10 @@ let asciiSym := asciiSym.trim;
{ info := unicodeSymbolInfo sym asciiSym,
fn := unicodeSymbolFn sym asciiSym }
/- Succeeds if RBP <= upper -/
/- Succeeds if prec <= upper -/
def checkPrecFn (upper : Nat) (errorMsg : String) : ParserFn :=
fun c s =>
if c.rbp <= upper then s
if c.prec <= upper then s
else s.mkUnexpectedError errorMsg
private def precErrorMsg := "unexpected token at this precedence level; consider parenthesizing the term"
@ -1400,12 +1400,12 @@ def categoryParserFnExtension : EnvExtension CategoryParserFn := arbitrary _
def categoryParserFn (catName : Name) : ParserFn :=
fun ctx s => categoryParserFnExtension.getState ctx.env catName ctx s
def categoryParser (catName : Name) (rbp : Nat) : Parser :=
{ fn := fun c s => categoryParserFn catName { c with rbp := rbp } s }
def categoryParser (catName : Name) (prec : Nat) : Parser :=
{ fn := fun c s => categoryParserFn catName { c with prec := prec } s }
-- Define `termParser` here because we need it for antiquotations
@[inline] def termParser (rbp : Nat := 0) : Parser :=
categoryParser `term rbp
@[inline] def termParser (prec : Nat := 0) : Parser :=
categoryParser `term prec
/- ============== -/
/- Antiquotations -/
@ -1514,8 +1514,8 @@ fun ctx s =>
| Syntax.ident _ _ catName _ => categoryParserFn catName ctx s
| _ => s.mkUnexpectedError ("failed to determine parser category using syntax stack, the specified element on the stack is not an identifier")
def categoryParserOfStack (offset : Nat) (rbp : Nat := 0) : Parser :=
{ fn := fun c s => categoryParserOfStackFn offset { c with rbp := rbp } s }
def categoryParserOfStack (offset : Nat) (prec : Nat := 0) : Parser :=
{ fn := fun c s => categoryParserOfStackFn offset { c with prec := prec } s }
private def mkResult (s : ParserState) (iniSz : Nat) : ParserState :=
if s.stackSize == iniSz + 1 then s
@ -1570,7 +1570,7 @@ partial def trailingLoop (tables : PrattParsingTables) (c : ParserContext) : Par
Implements a recursive precedence parser according to Pratt's algorithm: select a parser (or more, via
`longestMatchFn`) from `leadingTable` based on the current token (falling back to unindexed `leadingParsers` such as
application), then chain with parsers from `trailingTable`/`trailingParsers` as long as the precedence of the current
token is higher than `rbp` of the parser state.
token is higher than `prec` of the parser state.
As an extension of the original algorithm, we also check the current token's precedence before calling the leading
parser(s). We do this so we can define an n-ary application parser:
@ -1579,7 +1579,7 @@ partial def trailingLoop (tables : PrattParsingTables) (c : ParserContext) : Par
```
If the nested `termParser appPrec` did not check the precedence of the first token, we would accept bogus input such as
`f x fun y => y` because we would never check the precedence of `fun`. Note that, in contrast to trailing tokens, a
leading token is accepted if its precedence is *at least* `rbp`. This is necessary so that `f x y` is not parsed as
leading token is accepted if its precedence is *at least* `prec`. This is necessary so that `f x y` is not parsed as
`f (x y)`: the nested `termParser` call must accept the leading token `x` but not the trailing token `y`. But both have
the same precedence as identifiers, so we must use different comparisons.
@ -1762,9 +1762,9 @@ def compileParserDescr (categories : ParserCategories) : ParserDescr → Except
| ParserDescr.ident => pure $ ident
| ParserDescr.prec prec => pure $ checkPrec prec
| ParserDescr.nonReservedSymbol tk includeIdent => pure $ nonReservedSymbol tk includeIdent
| ParserDescr.parser catName rbp =>
| ParserDescr.parser catName prec =>
match categories.find? catName with
| some _ => pure $ categoryParser catName rbp
| some _ => pure $ categoryParser catName prec
| none => throwUnknownParserCategory catName
unsafe def mkParserOfConstantUnsafe (env : Environment) (categories : ParserCategories) (constName : Name) : Except String (Bool × Parser) :=
@ -1891,7 +1891,7 @@ def mkInputContext (input : String) (fileName : String) : InputContext :=
fileMap := input.toFileMap }
def mkParserContext (env : Environment) (ctx : InputContext) : ParserContext :=
{ rbp := 0,
{ prec := 0,
toInputContext := ctx,
env := env,
tokens := getTokenTable env }

View file

@ -29,17 +29,17 @@ namespace Term
/- Helper functions for defining simple parsers -/
def unicodeInfixR (sym : String) (asciiSym : String) (lbp : Nat) : TrailingParser :=
checkPrec lbp >> unicodeSymbol sym asciiSym >> termParser lbp
def unicodeInfixR (sym : String) (asciiSym : String) (prec : Nat) : TrailingParser :=
checkPrec prec >> unicodeSymbol sym asciiSym >> termParser prec
def infixR (sym : String) (lbp : Nat) : TrailingParser :=
checkPrec lbp >> symbol sym >> termParser lbp
def infixR (sym : String) (prec : Nat) : TrailingParser :=
checkPrec prec >> symbol sym >> termParser prec
def unicodeInfixL (sym : String) (asciiSym : String) (lbp : Nat) : TrailingParser :=
checkPrec lbp >> unicodeSymbol sym asciiSym >> termParser (lbp+1)
def unicodeInfixL (sym : String) (asciiSym : String) (prec : Nat) : TrailingParser :=
checkPrec prec >> unicodeSymbol sym asciiSym >> termParser (prec+1)
def infixL (sym : String) (lbp : Nat) : TrailingParser :=
checkPrec lbp >> symbol sym >> termParser (lbp+1)
def infixL (sym : String) (prec : Nat) : TrailingParser :=
checkPrec prec >> symbol sym >> termParser (prec+1)
def leadPrec := appPrec - 1