summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/go/scanner.go8
-rw-r--r--src/lib/go/scanner_test.go2
-rw-r--r--src/lib/go/token.go6
3 files changed, 14 insertions, 2 deletions
diff --git a/src/lib/go/scanner.go b/src/lib/go/scanner.go
index f665f10ba..0910e59de 100644
--- a/src/lib/go/scanner.go
+++ b/src/lib/go/scanner.go
@@ -447,7 +447,13 @@ scan_again:
case '>': tok = S.switch4(token.GTR, token.GEQ, '>', token.SHR, token.SHR_ASSIGN);
case '=': tok = S.switch2(token.ASSIGN, token.EQL);
case '!': tok = S.switch2(token.NOT, token.NEQ);
- case '&': tok = S.switch3(token.AND, token.AND_ASSIGN, '&', token.LAND);
+ case '&':
+ if S.ch == '^' {
+ S.next();
+ tok = S.switch2(token.AND_NOT, token.AND_NOT_ASSIGN);
+ } else {
+ tok = S.switch3(token.AND, token.AND_ASSIGN, '&', token.LAND);
+ }
case '|': tok = S.switch3(token.OR, token.OR_ASSIGN, '|', token.LOR);
default: S.error(loc, "illegal character " + charString(ch));
}
diff --git a/src/lib/go/scanner_test.go b/src/lib/go/scanner_test.go
index 221f01256..247bbe4df 100644
--- a/src/lib/go/scanner_test.go
+++ b/src/lib/go/scanner_test.go
@@ -76,6 +76,7 @@ var tokens = [...]elt{
elt{ token.XOR, "^", operator },
elt{ token.SHL, "<<", operator },
elt{ token.SHR, ">>", operator },
+ elt{ token.AND_NOT, "&^", operator },
elt{ token.ADD_ASSIGN, "+=", operator },
elt{ token.SUB_ASSIGN, "-=", operator },
@@ -88,6 +89,7 @@ var tokens = [...]elt{
elt{ token.XOR_ASSIGN, "^=", operator },
elt{ token.SHL_ASSIGN, "<<=", operator },
elt{ token.SHR_ASSIGN, ">>=", operator },
+ elt{ token.AND_NOT_ASSIGN, "&^=", operator },
elt{ token.LAND, "&&", operator },
elt{ token.LOR, "||", operator },
diff --git a/src/lib/go/token.go b/src/lib/go/token.go
index 1961fb10e..26ff1cb99 100644
--- a/src/lib/go/token.go
+++ b/src/lib/go/token.go
@@ -40,6 +40,7 @@ const (
XOR;
SHL;
SHR;
+ AND_NOT;
ADD_ASSIGN;
SUB_ASSIGN;
@@ -52,6 +53,7 @@ const (
XOR_ASSIGN;
SHL_ASSIGN;
SHR_ASSIGN;
+ AND_NOT_ASSIGN;
LAND;
LOR;
@@ -145,6 +147,7 @@ var tokens = map [int] string {
XOR : "^",
SHL : "<<",
SHR : ">>",
+ AND_NOT : "&^",
ADD_ASSIGN : "+=",
SUB_ASSIGN : "-=",
@@ -157,6 +160,7 @@ var tokens = map [int] string {
XOR_ASSIGN : "^=",
SHL_ASSIGN : "<<=",
SHR_ASSIGN : ">>=",
+ AND_NOT_ASSIGN : "&^=",
LAND : "&&",
LOR : "||",
@@ -264,7 +268,7 @@ func Precedence(tok int) int {
return 4;
case ADD, SUB, OR, XOR:
return 5;
- case MUL, QUO, REM, SHL, SHR, AND:
+ case MUL, QUO, REM, SHL, SHR, AND, AND_NOT:
return 6;
}
return LowestPrec;