bitwise operators and boolean operators
Some checks failed
Test / build (push) Waiting to run
Build / build (push) Has been cancelled

This commit is contained in:
Chuck Smith
2024-03-23 10:00:02 -04:00
parent cbb430b47d
commit ef8c8f8f04
13 changed files with 427 additions and 188 deletions

View File

@@ -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()

View File

@@ -138,6 +138,7 @@ func TestParsingPrefixExpressions(t *testing.T) {
{"-foobar;", "-", "foobar"},
{"!true;", "!", true},
{"!false;", "!", false},
{"~5;", "~", 5},
}
for _, tt := range prefixTests {