@@ -67,6 +67,7 @@ public enum ExpressionType: Equatable {
6767 indirect case prefix( PrefixOperator , Expression )
6868 indirect case infix( Expression , InfixOperator , Expression )
6969 indirect case member( Expression , Identifier )
70+ indirect case `subscript`( Expression , Expression )
7071 indirect case `import`( Expression )
7172}
7273
@@ -188,6 +189,8 @@ private extension TokenType {
188189 case . rbrace: return " closing brace "
189190 case . lparen, . call: return " opening paren "
190191 case . rparen: return " closing paren "
192+ case . lbracket, . subscript: return " opening bracket "
193+ case . rbracket: return " closing bracket "
191194 case . dot: return " dot "
192195 case . eof: return " end of file "
193196 }
@@ -461,18 +464,32 @@ private extension ArraySlice where Element == Token {
461464 range = range. lowerBound ..< endToken. range. upperBound
462465 case . keyword( . import) :
463466 type = try . import( require ( readExpressions ( ) , as: " file path " ) )
464- case . dot, . linebreak, . keyword, . infix, . lbrace, . rbrace, . rparen, . eof:
467+ case . dot, . linebreak, . keyword, . infix, . lbrace, . lbracket,
468+ . subscript, . rbrace, . rparen, . rbracket, . eof:
465469 self = start
466470 return nil
467471 }
468472 var expression = Expression ( type: type, range: range)
469- while case . dot = nextToken. type {
470- removeFirst ( )
471- let rhs = try require ( readIdentifier ( ) , as: " member name " )
472- expression = Expression (
473- type: . member( expression, rhs) ,
474- range: range. lowerBound ..< rhs. range. upperBound
475- )
473+ loop: while true {
474+ switch nextToken. type {
475+ case . dot:
476+ removeFirst ( )
477+ let rhs = try require ( readIdentifier ( ) , as: " member name " )
478+ expression = Expression (
479+ type: . member( expression, rhs) ,
480+ range: range. lowerBound ..< rhs. range. upperBound
481+ )
482+ case . subscript:
483+ removeFirst ( )
484+ let rhs = try require ( readExpression ( ) , as: " expression " )
485+ try requireToken ( . rbracket)
486+ expression = Expression (
487+ type: . subscript( expression, rhs) ,
488+ range: range. lowerBound ..< rhs. range. upperBound
489+ )
490+ default :
491+ break loop
492+ }
476493 }
477494 return expression
478495 }
@@ -665,9 +682,9 @@ private extension ArraySlice where Element == Token {
665682 default :
666683 return . expression( expression. type)
667684 }
668- // TODO: should call be treated differently here?
669- case . number, . linebreak, . keyword, . hexColor, . prefix,
670- . string , . rbrace, . lparen, . call, . rparen, . eof:
685+ // TODO: should call and subscript be treated differently here?
686+ case . number, . linebreak, . keyword, . hexColor, . prefix, . string ,
687+ . rbrace, . lparen, . call, . rparen, . lbracket , . rbracket , . subscript , . eof:
671688 return try . command( identifier, readExpressions ( ) )
672689 }
673690 }
0 commit comments