       "        </letStatement>"]
      ++ statement, rest3}
   end
-  
+
+  def parse_statement([{:keyword, "let"},
+                       {:identifier, var_lhs},
+                       {:symbol, "["}
+                       | rest]) do
+    {index_exp, rest1} = parse_e(rest)
+    [{:symbol, "]"},
+     {:symbol, "="} | rest2] = rest1
+    {rh_exp, rest3} = parse_e(rest2)
+    [{:symbol, ";"} | rest4] = rest3
+    {statement, rest5} = parse_statement(rest4)
+    {["        <letStatement>",
+      "          <keyword> let </keyword>",
+      "          <identifier> #{var_lhs} </identifier>",
+      "          <symbol> [ </symbol>",
+      "          <expression>"]
+     ++ index_exp
+     ++
+     ["          </expression>",
+      "          <symbol> ] </symbol>",
+      "          <symbol> = </symbol>",
+      "          <expression>"]
+     ++ rh_exp
+     ++
+     ["          </expression>",
+      "          <symbol> ; </symbol>",
+      "        </letStatement>"]
+     ++ statement, rest5}
+  end
+
   def parse_statement([{:keyword, "if"},
                        {:symbol, "("} | rest]) do
     {exp, rest1} = parse_e(rest)

     ["          <symbol> ) </symbol>",
      "        </term>"], rest1}
  end
  
  def parse_expression([{:symbol, s} | _]=all)
  when s in @expression_closing_symbols do

      "              <keyword> #{keyword_const} </keyword>",
      "            </term>"], [op_token | rest]}    
  end

  # subroutine 1 of 2 (where's #2?)
  def parse_expression([{:identifier, class_or_var_name},
                        {:symbol, "."},
                        {:identifier, subroutine_name},
