Operators '??' and '?=' added
This commit is contained in:
+7
-68
@@ -172,7 +172,13 @@ func (self *scanner) fetchNextToken() (tk *Token) {
|
||||
tk = self.makeToken(SymExclamation, ch)
|
||||
}
|
||||
case '?':
|
||||
tk = self.makeToken(SymQuestion, ch)
|
||||
if next, _ := self.peek(); next == '?' {
|
||||
tk = self.moveOn(SymDoubleQuestion, ch, next)
|
||||
} else if next, _ := self.peek(); next == '=' {
|
||||
tk = self.moveOn(SymQuestionEqual, ch, next)
|
||||
} else {
|
||||
tk = self.makeToken(SymQuestion, ch)
|
||||
}
|
||||
case '&':
|
||||
if next, _ := self.peek(); next == '&' {
|
||||
tk = self.moveOn(SymDoubleAmpersand, ch, next)
|
||||
@@ -371,73 +377,6 @@ func (self *scanner) fetchOnLineComment() *Token {
|
||||
return self.fetchUntil(SymComment, true, '\n')
|
||||
}
|
||||
|
||||
// func (self *scanner) fetchUntil(sym Symbol, allowEos bool, endings ...byte) (tk *Token) {
|
||||
// var err error
|
||||
// var ch byte
|
||||
// var sb strings.Builder
|
||||
// var value string
|
||||
// end := string(endings)
|
||||
// endReached := false
|
||||
// for ch, err = self.readChar(); err == nil && !endReached; {
|
||||
// sb.WriteByte(ch)
|
||||
// if sb.Len() >= len(end) && strings.HasSuffix(sb.String(), end) {
|
||||
// value = sb.String()[0 : sb.Len()-len(end)]
|
||||
// endReached = true
|
||||
// } else {
|
||||
// ch, err = self.readChar()
|
||||
// }
|
||||
// }
|
||||
// if !endReached && allowEos {
|
||||
// value = sb.String()
|
||||
// endReached = true
|
||||
// }
|
||||
|
||||
// if endReached {
|
||||
// tk = self.makeValueToken(sym, "", value)
|
||||
// } else {
|
||||
// tk = self.makeErrorToken(err)
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
|
||||
// func (self *scanner) fetchUntil(sym Symbol, allowEos bool, endings ...byte) (tk *Token) {
|
||||
// var err error
|
||||
// var ch byte
|
||||
// var sb strings.Builder
|
||||
// var value string
|
||||
// end := make([]byte, len(endings))
|
||||
// length := 0
|
||||
// endReached := false
|
||||
// for ch, err = self.readChar(); err == nil && !endReached; {
|
||||
// sb.WriteByte(ch)
|
||||
// if length == len(endings) {
|
||||
// for i := 0; i < length-1; i++ {
|
||||
// end[i] = end[i+1]
|
||||
// }
|
||||
// length--
|
||||
// }
|
||||
// end[length] = ch
|
||||
// length++
|
||||
// if bytes.Equal(endings, end) {
|
||||
// value = sb.String()[0 : sb.Len()-len(end)]
|
||||
// endReached = true
|
||||
// } else {
|
||||
// ch, err = self.readChar()
|
||||
// }
|
||||
// }
|
||||
// if !endReached && allowEos {
|
||||
// value = sb.String()
|
||||
// endReached = true
|
||||
// }
|
||||
|
||||
// if endReached {
|
||||
// tk = self.makeValueToken(sym, "", value)
|
||||
// } else {
|
||||
// tk = self.makeErrorToken(err)
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
|
||||
func (self *scanner) fetchUntil(sym Symbol, allowEos bool, endings ...byte) (tk *Token) {
|
||||
var err error
|
||||
var ch byte
|
||||
|
||||
Reference in New Issue
Block a user