44 lines
811 B
Go
44 lines
811 B
Go
package parser
|
|
|
|
import (
|
|
"code.jmug.me/jmug/compiler-in-go/pkg/token"
|
|
)
|
|
|
|
const (
|
|
_ int = iota
|
|
LOWEST
|
|
EQUALS // ==
|
|
LESSGREATER // > or <
|
|
SUM // +
|
|
PRODUCT // *
|
|
PREFIX // -X or !X
|
|
CALL // myFunction(X)
|
|
INDEX // array[index]
|
|
)
|
|
|
|
var precedences = map[token.TokenType]int{
|
|
token.EQ: EQUALS,
|
|
token.NOT_EQ: EQUALS,
|
|
token.GT: LESSGREATER,
|
|
token.LT: LESSGREATER,
|
|
token.PLUS: SUM,
|
|
token.MINUS: SUM,
|
|
token.ASTERISK: PRODUCT,
|
|
token.SLASH: PRODUCT,
|
|
token.LPAREN: CALL,
|
|
token.LBRACKET: INDEX,
|
|
}
|
|
|
|
func (p *Parser) peekPrecedence() int {
|
|
if pr, ok := precedences[p.peekToken.Type]; ok {
|
|
return pr
|
|
}
|
|
return LOWEST
|
|
}
|
|
|
|
func (p *Parser) curPrecedence() int {
|
|
if pr, ok := precedences[p.curToken.Type]; ok {
|
|
return pr
|
|
}
|
|
return LOWEST
|
|
}
|