def parse_array
expr = parse_item()
while true do
case token()
when '['
scan()
index_expr = parse_expression()
_syntaxerr("array '[' is not closed.") unless token() == ']'
scan()
expr = ExprNode.new('[]', expr, index_expr)
when '{'
scan()
index_expr = parse_expression()
_syntaxerr("hash '{' is not closed.") unless token() == '}'
scan()
expr = ExprNode.new('{}', expr, index_expr)
when '[:'
scan()
_syntaxerr("'[:' require a word.") unless token() == :name
word = token_str
scan()
_syntaxerr("']' required.") unless token() == ']'
scan()
expr = ExprNode.new('[:]', expr, word)
when '.'
scan()
_syntaxerr("property name is invalid.") unless token() == :name
property = token_str
scan()
expr = ExprNode.new('.', expr, property)
else
break
end
end
return expr
end