@@ -14,6 +14,9 @@ import (
1414var (
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 ,
2427
2528const (
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 :]
0 commit comments