bitwise operators and boolean operators
This commit is contained in:
@@ -11,9 +11,15 @@ import (
|
||||
const (
|
||||
_ int = iota
|
||||
LOWEST
|
||||
OR
|
||||
AND
|
||||
NOT
|
||||
ASSIGN // := or =
|
||||
EQUALS // ==
|
||||
LESSGREATER // > or <
|
||||
BITWISE_OR // |
|
||||
BITWISE_XOR // ^
|
||||
BITWISE_AND // &
|
||||
SUM // + or -
|
||||
PRODUCT // * or / or %
|
||||
PREFIX // -X or !X
|
||||
@@ -22,22 +28,28 @@ const (
|
||||
)
|
||||
|
||||
var precedences = map[token.TokenType]int{
|
||||
token.BIND: ASSIGN,
|
||||
token.ASSIGN: ASSIGN,
|
||||
token.EQ: EQUALS,
|
||||
token.NOT_EQ: EQUALS,
|
||||
token.LT: LESSGREATER,
|
||||
token.GT: LESSGREATER,
|
||||
token.LTE: LESSGREATER,
|
||||
token.GTE: LESSGREATER,
|
||||
token.PLUS: SUM,
|
||||
token.MINUS: SUM,
|
||||
token.SLASH: PRODUCT,
|
||||
token.ASTERISK: PRODUCT,
|
||||
token.PERCENT: PRODUCT,
|
||||
token.LPAREN: CALL,
|
||||
token.LBRACKET: INDEX,
|
||||
token.DOT: INDEX,
|
||||
token.OR: OR,
|
||||
token.AND: AND,
|
||||
token.NOT: NOT,
|
||||
token.BIND: ASSIGN,
|
||||
token.ASSIGN: ASSIGN,
|
||||
token.EQ: EQUALS,
|
||||
token.NOT_EQ: EQUALS,
|
||||
token.LT: LESSGREATER,
|
||||
token.GT: LESSGREATER,
|
||||
token.LTE: LESSGREATER,
|
||||
token.GTE: LESSGREATER,
|
||||
token.BITWISE_OR: BITWISE_OR,
|
||||
token.BITWISE_XOR: BITWISE_XOR,
|
||||
token.BITWISE_AND: BITWISE_AND,
|
||||
token.PLUS: SUM,
|
||||
token.MINUS: SUM,
|
||||
token.DIVIDE: PRODUCT,
|
||||
token.MULTIPLY: PRODUCT,
|
||||
token.MODULO: PRODUCT,
|
||||
token.LPAREN: CALL,
|
||||
token.LBRACKET: INDEX,
|
||||
token.DOT: INDEX,
|
||||
}
|
||||
|
||||
type (
|
||||
@@ -65,7 +77,6 @@ func New(l *lexer.Lexer) *Parser {
|
||||
p.prefixParseFns = make(map[token.TokenType]prefixParseFn)
|
||||
p.registerPrefix(token.IDENT, p.parseIdentifier)
|
||||
p.registerPrefix(token.INT, p.parseIntegerLiteral)
|
||||
p.registerPrefix(token.BANG, p.parsePrefixExpression)
|
||||
p.registerPrefix(token.MINUS, p.parsePrefixExpression)
|
||||
p.registerPrefix(token.TRUE, p.parseBoolean)
|
||||
p.registerPrefix(token.FALSE, p.parseBoolean)
|
||||
@@ -81,9 +92,9 @@ func New(l *lexer.Lexer) *Parser {
|
||||
p.infixParseFns = make(map[token.TokenType]infixParseFn)
|
||||
p.registerInfix(token.PLUS, p.parseInfixExpression)
|
||||
p.registerInfix(token.MINUS, p.parseInfixExpression)
|
||||
p.registerInfix(token.SLASH, p.parseInfixExpression)
|
||||
p.registerInfix(token.ASTERISK, p.parseInfixExpression)
|
||||
p.registerInfix(token.PERCENT, p.parseInfixExpression)
|
||||
p.registerInfix(token.DIVIDE, p.parseInfixExpression)
|
||||
p.registerInfix(token.MULTIPLY, p.parseInfixExpression)
|
||||
p.registerInfix(token.MODULO, p.parseInfixExpression)
|
||||
p.registerInfix(token.EQ, p.parseInfixExpression)
|
||||
p.registerInfix(token.NOT_EQ, p.parseInfixExpression)
|
||||
p.registerInfix(token.LT, p.parseInfixExpression)
|
||||
@@ -96,6 +107,15 @@ func New(l *lexer.Lexer) *Parser {
|
||||
p.registerInfix(token.ASSIGN, p.parseAssignmentExpression)
|
||||
p.registerInfix(token.DOT, p.parseSelectorExpression)
|
||||
|
||||
p.registerPrefix(token.BITWISE_NOT, p.parsePrefixExpression)
|
||||
p.registerInfix(token.BITWISE_OR, p.parseInfixExpression)
|
||||
p.registerInfix(token.BITWISE_XOR, p.parseInfixExpression)
|
||||
p.registerInfix(token.BITWISE_AND, p.parseInfixExpression)
|
||||
|
||||
p.registerPrefix(token.NOT, p.parsePrefixExpression)
|
||||
p.registerInfix(token.OR, p.parseInfixExpression)
|
||||
p.registerInfix(token.AND, p.parseInfixExpression)
|
||||
|
||||
// Read two tokens, so curToken and peekToken are both set
|
||||
p.nextToken()
|
||||
p.nextToken()
|
||||
|
||||
@@ -138,6 +138,7 @@ func TestParsingPrefixExpressions(t *testing.T) {
|
||||
{"-foobar;", "-", "foobar"},
|
||||
{"!true;", "!", true},
|
||||
{"!false;", "!", false},
|
||||
{"~5;", "~", 5},
|
||||
}
|
||||
|
||||
for _, tt := range prefixTests {
|
||||
|
||||
Reference in New Issue
Block a user