      ["          <symbol> ) </symbol>",
       "        </term>"], rest1}
   end
+
+  def parse_expression([{:identifier, var_name},
+                        {:symbol, "["}
+                        | rest]) do
+    {exp, rest1} = parse_e(rest)
+    [{:symbol, "]"} | rest2] = rest1
+    {["<term>",
+      "<identifier> #{var_name} </identifier>",
+      "<symbol> [ </symbol>",
+      "<expression>"]
+     
+     ++ exp
+     ++
+     ["</expression>",
+      "<symbol> ] </symbol>",
+      "</term>"], rest2}
+  end
   
   def parse_expression([{:symbol, s} | _]=all)
   when s in @expression_closing_symbols do

      "              <keyword> #{keyword_const} </keyword>",
      "            </term>"], [op_token | rest]}    
  end
    
  def parse_expression([{:identifier, class_or_var_name},
                        {:symbol, "."},
                        {:identifier, subroutine_name},

      "        </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)
