def parse_move
      s0 = @current_pos
      s1 = parse_normal_move
      s1 = parse_special_move if s1 == :failed
      if s1 != :failed
        s2 = parse_time
        s2 = nil if s2 == :failed
        s3 = parse_comments
        @reported_pos = s0
        s0 = -> (move, time, comments) do
          ret = {}
          ret["comments"] = comments if !comments.empty?
          ret["time"] = time if time
          if move["special"]
            ret["special"] = move["special"]
          else
            ret["move"] = move
          end
          ret
        end.call(s1, s2, s3)
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_move
      s0 = @current_pos
      s1 = parse_normal_move
      s1 = parse_special_move if s1 == :failed
      if s1 != :failed
        s2 = parse_time
        s2 = nil if s2 == :failed
        s3 = parse_comments
        @reported_pos = s0
        s0 = -> (move, time, comments) do
          ret = {}
          ret["comments"] = comments if !comments.empty?
          ret["time"] = time if time
          if move["special"]
            ret["special"] = move["special"]
          else
            ret["move"] = move
          end
          ret
        end.call(s1, s2, s3)
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
move : (normalmove | specialmove) time? comment*