Skip to content

Commit e11df5c

Browse files
aykevldeadprogram
authored andcommitted
cgo: add support for bitwise operators
1 parent 656805d commit e11df5c

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

cgo/const.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import (
1414
var (
1515
prefixParseFns map[token.Token]func(*tokenizer) (ast.Expr, *scanner.Error)
1616
precedences = map[token.Token]int{
17+
token.OR: precedenceOr,
18+
token.XOR: precedenceXor,
19+
token.AND: precedenceAnd,
1720
token.ADD: precedenceAdd,
1821
token.SUB: precedenceAdd,
1922
token.MUL: precedenceMul,
@@ -24,6 +27,9 @@ var (
2427

2528
const (
2629
precedenceLowest = iota + 1
30+
precedenceOr
31+
precedenceXor
32+
precedenceAnd
2733
precedenceAdd
2834
precedenceMul
2935
precedencePrefix
@@ -76,7 +82,7 @@ func parseConstExpr(t *tokenizer, precedence int) (ast.Expr, *scanner.Error) {
7682

7783
for t.peekToken != token.EOF && precedence < precedences[t.peekToken] {
7884
switch t.peekToken {
79-
case token.ADD, token.SUB, token.MUL, token.QUO, token.REM:
85+
case token.OR, token.XOR, token.AND, token.ADD, token.SUB, token.MUL, token.QUO, token.REM:
8086
t.Next()
8187
leftExpr, err = parseBinaryExpr(t, leftExpr)
8288
}
@@ -199,7 +205,18 @@ func (t *tokenizer) Next() {
199205
// https://en.cppreference.com/w/cpp/string/byte/isspace
200206
t.peekPos++
201207
t.buf = t.buf[1:]
202-
case c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/' || c == '%':
208+
case len(t.buf) >= 2 && (string(t.buf[:2]) == "||" || string(t.buf[:2]) == "&&"):
209+
// Two-character tokens.
210+
switch c {
211+
case '&':
212+
t.peekToken = token.LAND
213+
case '|':
214+
t.peekToken = token.LOR
215+
}
216+
t.peekValue = t.buf[:2]
217+
t.buf = t.buf[2:]
218+
return
219+
case c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '&' || c == '|' || c == '^':
203220
// Single-character tokens.
204221
// TODO: ++ (increment) and -- (decrement) operators.
205222
switch c {
@@ -217,6 +234,12 @@ func (t *tokenizer) Next() {
217234
t.peekToken = token.QUO
218235
case '%':
219236
t.peekToken = token.REM
237+
case '&':
238+
t.peekToken = token.AND
239+
case '|':
240+
t.peekToken = token.OR
241+
case '^':
242+
t.peekToken = token.XOR
220243
}
221244
t.peekValue = t.buf[:1]
222245
t.buf = t.buf[1:]

cgo/const_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ func TestParseConst(t *testing.T) {
3737
{`5*5`, `5 * 5`},
3838
{`5/5`, `5 / 5`},
3939
{`5%5`, `5 % 5`},
40+
{`5&5`, `5 & 5`},
41+
{`5|5`, `5 | 5`},
42+
{`5^5`, `5 ^ 5`},
43+
{`5||5`, `error: 1:2: unexpected token ||, expected end of expression`}, // logical binops aren't supported yet
4044
{`(5/5)`, `(5 / 5)`},
4145
{`1 - 2`, `1 - 2`},
4246
{`1 - 2 + 3`, `1 - 2 + 3`},

0 commit comments

Comments
 (0)